Loading the Packages

library(pacman)
p_load(tidyverse, haven,sjmisc,
                     forcats, weights, car,
                     countrycode, lavaan,
                     semTools, lavaan.survey,
                     survey, reshape2, favstats)

Loading the URLs

afro5_url        <-url('https://github.com/favstats/database_delib/raw//master/afro5.RData')
afro6_url        <-url('https://github.com/favstats/database_delib/raw//master/afro6.RData')
latino2013_url   <-url('https://github.com/favstats/database_delib/raw//master/latino2013.RData')
latino2015_url   <-url('https://github.com/favstats/database_delib/raw//master/latino2015.RData')
wvs_raw_url      <-url('https://github.com/favstats/database_delib/raw//master/wvs_raw.RData')
americas_url     <-url('https://github.com/favstats/database_delib/raw//master/americas.RData')
bolivia_url      <-url('https://github.com/favstats/database_delib/raw//master/bolivia.RData')
canada_url       <-url('https://github.com/favstats/database_delib/raw//master/canada.RData')
asian_raw_url    <-url('https://github.com/favstats/database_delib/raw//master/asian_raw.RData')
myanmar_raw_url  <-url('https://github.com/favstats/database_delib/raw//master/myanmar_raw.RData')
mongolia_raw_url <-url('https://github.com/favstats/database_delib/raw//master/mongolia_raw.RData')
philip_raw_url   <-url('https://github.com/favstats/database_delib/raw//master/philip_raw.RData')
taiwan_raw_url   <-url('https://github.com/favstats/database_delib/raw//master/taiwan_raw.RData')
thai_raw_url     <-url('https://github.com/favstats/database_delib/raw//master/thai_raw.RData')
malay_raw_url    <-url('https://github.com/favstats/database_delib/raw//master/malay_raw.RData')
singapore_raw_url<-url('https://github.com/favstats/database_delib/raw//master/singapore_raw.RData')
sk_raw_url       <-url('https://github.com/favstats/database_delib/raw//master/sk_raw.RData')
cambodia_raw_url <-url('https://github.com/favstats/database_delib/raw//master/cambodia_raw.RData')
ESS_raw_url      <-url('https://github.com/favstats/database_delib/blob/master/ESS_raw.Rdata?raw=true')
vdems_start_url  <-url('https://github.com/favstats/database_delib/raw//master/vdems_start.Rdata')
qog_url          <-url('https://github.com/favstats/database_delib/raw//master/qog.Rdata')

Afrobarometer Data

Afro 5

load(afro5_url)
Warning in .Internal(getRegisteredNamespace(name)) :
  closing unused connection 44 (https://github.com/favstats/database_delib/raw//master/qog.Rdata)
Warning in .Internal(getRegisteredNamespace(name)) :
  closing unused connection 43 (https://github.com/favstats/database_delib/raw//master/vdems_start.Rdata)
Warning in .Internal(getRegisteredNamespace(name)) :
  closing unused connection 42 (https://github.com/favstats/database_delib/blob/master/ESS_raw.Rdata?raw=true)
Warning in .Internal(getRegisteredNamespace(name)) :
  closing unused connection 41 (https://github.com/favstats/database_delib/raw//master/cambodia_raw.RData)
Warning in .Internal(getRegisteredNamespace(name)) :
  closing unused connection 40 (https://github.com/favstats/database_delib/raw//master/sk_raw.RData)
Warning in .Internal(getRegisteredNamespace(name)) :
  closing unused connection 39 (https://github.com/favstats/database_delib/raw//master/singapore_raw.RData)
Warning in .Internal(getRegisteredNamespace(name)) :
  closing unused connection 38 (https://github.com/favstats/database_delib/raw//master/malay_raw.RData)
Warning in .Internal(getRegisteredNamespace(name)) :
  closing unused connection 37 (https://github.com/favstats/database_delib/raw//master/thai_raw.RData)
Warning in .Internal(getRegisteredNamespace(name)) :
  closing unused connection 36 (https://github.com/favstats/database_delib/raw//master/taiwan_raw.RData)
Warning in .Internal(getRegisteredNamespace(name)) :
  closing unused connection 35 (https://github.com/favstats/database_delib/raw//master/philip_raw.RData)
Warning in .Internal(getRegisteredNamespace(name)) :
  closing unused connection 34 (https://github.com/favstats/database_delib/raw//master/mongolia_raw.RData)
Warning in .Internal(getRegisteredNamespace(name)) :
  closing unused connection 33 (https://github.com/favstats/database_delib/raw//master/myanmar_raw.RData)
Warning in .Internal(getRegisteredNamespace(name)) :
  closing unused connection 32 (https://github.com/favstats/database_delib/raw//master/asian_raw.RData)
Warning in .Internal(getRegisteredNamespace(name)) :
  closing unused connection 31 (https://github.com/favstats/database_delib/raw//master/canada.RData)
Warning in .Internal(getRegisteredNamespace(name)) :
  closing unused connection 30 (https://github.com/favstats/database_delib/raw//master/bolivia.RData)
Warning in .Internal(getRegisteredNamespace(name)) :
  closing unused connection 29 (https://github.com/favstats/database_delib/raw//master/americas.RData)
Warning in .Internal(getRegisteredNamespace(name)) :
  closing unused connection 28 (https://github.com/favstats/database_delib/raw//master/wvs_raw.RData)
Warning in .Internal(getRegisteredNamespace(name)) :
  closing unused connection 27 (https://github.com/favstats/database_delib/raw//master/latino2015.RData)
Warning in .Internal(getRegisteredNamespace(name)) :
  closing unused connection 26 (https://github.com/favstats/database_delib/raw//master/latino2013.RData)
Warning in .Internal(getRegisteredNamespace(name)) :
  closing unused connection 25 (https://github.com/favstats/database_delib/raw//master/afro6.RData)
delete_na_afro <- function(x) {
  x<-Recode(x, "9 = NA;
            98 = NA;
            99 = NA;
            -1 = NA")
  return(x)
} #Funktion um die NAs im Afro Datensatz zu bestimmen
# alle Variablen
afro_5 <- afro5  %>% 
  rename(educ = Q97,          #Variablen umbenennen
         income = Q3B, 
         sex = Q101, 
         work = Q96,
         trust_gov = Q59A,
         trust_parliament = Q59B,
         trust_police = Q59H,
         trust_courts = Q59J,
         demtoday = Q46A) %>%
  mutate_at(vars(income, trust_gov, trust_parliament, 
                 trust_police, trust_courts, work), 
            delete_na_afro) %>%   #NAs deleten 
  mutate(sex = sex - 1,   #sex (0/1) codieren
         work = Recode(work, #work (0/1) codieren
                       "1 = 0;
                  2 = 1;
                  3 = 1"),
         age = Recode(Q1, #missing values l?schen
                      "-1 = NA;
                                  998 = NA;
                                  999 = NA"),
         demtoday = Recode(demtoday,
                           "-1 = NA;
                                   98 = NA;
                                   99 = NA"),
         educ = Recode(educ,
                       "-1 = NA;
                                   98 = NA;
                                   99 = NA;
                                  999 = NA"),
         cntry = to_label(COUNTRY_ALPHA),
         year = as.numeric(format(DATEINTR,'%Y'))) %>%
  select(cntry,year,age,sex, income, educ, work, demtoday, trust_gov, trust_parliament,
         trust_police, trust_courts) %>%
  mutate_at(vars(income, demtoday, educ, 
                 trust_gov, trust_parliament, 
                 trust_police, trust_courts), 
            range01)
afro_5

Afro 6

load(afro6_url)
afro_6 <- afro6 %>%
  rename(educ = Q97, 
         income = Q4B, 
         sex = Q101, 
         work = Q95,
         trust_gov = Q52A,
         trust_parliament = Q52B,
         trust_police = Q52H,
         trust_courts = Q52J,
         demtoday = Q40)%>%
  mutate_at(vars(income, demtoday, trust_gov, 
                 trust_parliament, trust_police, 
                 trust_courts, work), 
            delete_na_afro) %>%   #NAs deleten 
  mutate(sex = sex - 1,   #sex (0/1) codieren
         work = Recode(work, #work (0/1) codieren
                       "1 = 0;
                       2 = 1;
                       3 = 1"),
         age = Recode(Q1, #missing values l?schen
                      "-1 = NA;
                      998 = NA;
                      999 = NA"),
         educ = Recode(educ,
                       "-1 = NA;
                       98 = NA;
                       99 = NA;
                       999 = NA"),
         demtoday = Recode(demtoday, 
                           "8 = NA"),
         cntry = to_label(COUNTRY_R5List),
         year = as.numeric(format(DATEINTR,'%Y'))) %>%
  select(cntry,year,age,sex, income, 
         educ, work, demtoday, 
         trust_gov, trust_parliament, 
         trust_police, trust_courts) %>%
#  mutate_at(vars(income, demtoday, educ, age,
#                 trust_gov, trust_parliament, 
#                 trust_police, trust_courts), 
#            as.character) %>%
#  mutate_at(vars(income, demtoday, educ, age,
#                 trust_gov, trust_parliament, 
#                 trust_police, trust_courts), 
#            as.numeric) %>%
  mutate_at(vars(income, demtoday, educ, 
                 trust_gov, trust_parliament, 
                 trust_police, trust_courts), 
            range01)
afro_6

Merging the Data

afro_real <- afro_5 %>% select(cntry,year,
                                     educ,income,sex,age,work,
                                     demtoday,trust_gov, trust_parliament, 
                                     trust_police,trust_courts)
afro_real2 <- afro_6 %>% select(cntry,year,
                                      educ,income,sex,age,work,
                                      demtoday,trust_gov, trust_parliament, 
                                      trust_police,trust_courts)
#length(unique(afro_real$cntry))
#length(unique(afro_real2$cntry))
#table(afro_real2$year)
afro <- rbind(afro_real,afro_real2) %>% as.tbl()
afro

Latino Barometro

Latino 2013

load(latino2013_url)
latino_2013 <-latino2013 %>% 
  rename(educ = REEDUC_1,
         income = S6,
         demtoday = P50TGB.A,
         age = S11) %>%
  mutate(sex = S10 - 1, #sex variable erstellen
         cntry = to_label(IDENPA), #cntry variable erstellen
         trust_gov = 5-P26TGB.B,
         trust_parliament = 5-P26TGB.C,
         trust_police = 5-P28TGB.B,
         trust_courts = 5-P26TGB.E,
         year = 2013,
         income = 5 - income,
         work = Recode(S19.A,
                           "2 = 1;
                            3 = 1;
                            4 = 0;
                            5 = 0;
                            6 = 0;
                            7 = 0")) %>%
  select(cntry,year,age,sex, income, educ, work, demtoday, trust_gov, trust_parliament,
         trust_police, trust_courts) %>%
#  mutate_at(vars(income, demtoday, educ, 
#                 trust_gov, trust_parliament, 
#                 trust_police, trust_courts), 
#            as.character) %>%
#  mutate_at(vars(income, demtoday, educ, 
#                 trust_gov, trust_parliament, 
#                 trust_police, trust_courts), 
#            as.numeric) %>%
  mutate_at(vars(income, demtoday, educ, 
                 trust_gov, trust_parliament, 
                 trust_police, trust_courts), 
            range01)
  
latino_2013

Latino 2015

load(latino2015_url)
latino_2015 <-latino2015 %>% 
  mutate(sex = S12 - 1) %>% #sex variable erstellen
  rename(educ = REEDUC_1,
         income = S4,
         demtoday = P17STGBS,
         age = S13) %>%
  mutate(trust_gov = 5-P16ST.G,
         trust_parliament = 5-P16ST.F,
         trust_police = 5-P16TGB.B,
         trust_courts = 5-P16ST.H,
         work = Recode(S21.A,
                           "2 = 1;
                            3 = 1;
                            4 = 0;
                            5 = 0;
                            6 = 0;
                            7 = 0"),
         cntry = to_label(IDENPA),
         income = 5 - income,
         year = 2015) %>%
  select(cntry,year,age,sex, income, educ, work, demtoday, trust_gov, trust_parliament,
         trust_police, trust_courts) %>%
#  mutate_at(vars(income, demtoday, educ, 
#                 trust_gov, trust_parliament, 
#                 trust_police, trust_courts), 
#                                as.character) %>%
#  mutate_at(vars(income, demtoday, educ, 
#                 trust_gov, trust_parliament, 
#                 trust_police, trust_courts), 
#                                as.numeric) %>%
  mutate_at(vars(income, demtoday, educ, 
                 trust_gov, trust_parliament, 
                 trust_police, trust_courts), 
                                range01)
latino_2015

Merging the Data

latino_real <- latino_2013 %>% select(cntry,year,
                                      educ,income,sex,age,work,
                                      demtoday,trust_gov, trust_parliament, 
                                      trust_police,trust_courts)
latino_real2 <- latino_2015 %>% select(cntry,year,
                                       educ,income,sex,age,work,
                                       demtoday,trust_gov, trust_parliament, 
                                       trust_police,trust_courts)
#length(unique(afro_real$cntry))
#length(unique(afro_real2$cntry))
#table(afro_real2$year)
latino <- rbind(latino_real,latino_real2) %>% as.tbl()
latino

World Value Survey

load(wvs_raw_url)
wvs <-wvs_raw %>% 
  rename(educ = V248,
         income = V239,
         demtoday = V141,
         age = V242,
         year = V262) %>%
  mutate(sex = V240 -1,  #sex variable erstellen
         trust_gov = 5-V115,
         trust_parliament = 5-V117,
         trust_police = 5-V113,
         trust_courts = 5-V114,
         work = Recode(V229,
                       "2 = 1;
                       3 = 1;
                       4 = 0;
                       5 = 0;
                       6 = 0;
                       7 = 0;
                       8 = 0"),
         cntry = to_label(V2)) %>%
  select(cntry,year,age,sex, income, educ, work, demtoday, 
         trust_gov, trust_parliament,
         trust_police, trust_courts) %>%
  mutate_at(vars(income, demtoday, educ, 
                 trust_gov, trust_parliament, 
                 trust_police, trust_courts), 
            as.character) %>%
  mutate_at(vars(income, demtoday, educ, 
                 trust_gov, trust_parliament, 
                 trust_police, trust_courts), 
            as.numeric) %>%
  mutate_at(vars(income, demtoday, educ, 
                 trust_gov, trust_parliament, 
                 trust_police, trust_courts), 
            range01)
wvs

Americas Barometer

Americas Main

load(americas_url)
americas_ <- americas %>%
  mutate(cntry = to_label(pais)) %>%
  select(cntry, ocup4a, ed, q10new, q1, q2, 
         b10a, b13, b18, b21a, n3, year) %>%
  rename(work = ocup4a,
         educ = ed,
         income = q10new,
         sex = q1,
         age = q2,
         trust_courts = b10a,
         trust_parliament = b13,
         trust_police = b18,
         trust_gov = b21a,
         demtoday = n3) %>%
  mutate(sex = sex -1,  #sex variable erstellen
         work = Recode(work,
                      "2 = 1;
                       3 = 1;
                       4 = 0;
                       5 = 0;
                       6 = 0;
                       7 = 0")) %>%
  mutate_at(vars(income, demtoday, educ, 
                 trust_gov, trust_parliament, 
                 trust_police, trust_courts), 
            range01)
americas_

Bolivia

load(bolivia_url)
bolivia_ <- bolivia %>%
  mutate(cntry = to_label(pais)) %>%
  select(cntry, ocup4a, ed, q10new, q1, q2, 
         b10a, b13, b18, b21a, n3, year) %>%
  rename(work = ocup4a,
         educ = ed,
         income = q10new,
         sex = q1,
         age = q2,
         trust_courts = b10a,
         trust_parliament = b13,
         trust_police = b18,
         trust_gov = b21a, #viele missing values
         demtoday = n3) %>%
  mutate(sex = sex -1,  #sex variable erstellen
         work = Recode(work,
                       "2 = 1;
                       3 = 1;
                       4 = 0;
                       5 = 0;
                       6 = 0;
                       7 = 0")) %>%
  mutate_at(vars(income, demtoday, educ, 
                 trust_gov, trust_parliament, 
                 trust_police, trust_courts), 
            range01)        
bolivia_

Canada

load(canada_url)

canada_ <- canada %>%
  mutate(cntry = to_label(pais)) %>%
  select(cntry, exc13, education, q10, q1, q2, 
         b10a, b13, b18, b21a, n3, year) %>%
  rename(work = exc13,
         educ = education,
         income = q10,
         sex = q1,
         age = q2,
         trust_courts = b10a,
         trust_parliament = b13,
         trust_police = b18,
         trust_gov = b21a,
         demtoday = n3) %>%
  mutate(sex = sex -1,  #sex variable erstellen
         work = work - 1,
         income = ifelse(income == 88, NA, income)) %>%
  mutate_at(vars(income, demtoday, educ, 
                 trust_gov, trust_parliament, 
                 trust_police, trust_courts), 
            range01)        

canada_

Merging the Data

americas <- americas_ %>% dplyr::select(cntry,year,
                                       educ,income,sex,age,work,
                                       demtoday,trust_gov, trust_parliament, 
                                       trust_police,trust_courts)
bolivia <- bolivia_ %>% dplyr::select(cntry,year,
                                      educ,income,sex,age,work,
                                      demtoday,trust_gov, trust_parliament, 
                                      trust_police,trust_courts)
canada <- canada_ %>% dplyr::select(cntry,year,
                                   educ,income,sex,age,work,
                                   demtoday,trust_gov, trust_parliament, 
                                   trust_police,trust_courts)
americas <- rbind(americas,bolivia,canada)
americas

Asian Barometer

load(asian_raw_url)
delete_na_asian <- function(x) {
  x<-Recode(x,
            "-2 = NA;
            7 = NA;
            8 = NA;
            9 = NA;
            97 = NA;
            98 = NA;
            99 = NA;
            -1 = NA")
  
  return(x)
} #Funktion um die NAs im asian Datensatz zu bestimmen
asian_3 <- asian_raw %>%
  rename(educ = se5,
         trust_gov = q9,
         trust_parliament = q11,
         trust_police = q14,
         trust_courts = q8,
         sex = se2,
         income = se13a,
         work = se9) %>%
  mutate_at(vars(income, trust_gov, trust_parliament, 
                 trust_police, trust_courts, work, sex), 
            delete_na_asian) %>%   #NAs deleten 
  mutate(trust_gov = 5 - trust_gov,
         trust_parliament = 5 - trust_parliament,
         trust_police = 5 - trust_police,
         trust_courts = 5 - trust_courts,
         sex = sex - 1,   #sex (0/1) codieren
         income = Recode(income,
                         "0 = NA"),
         income = 5 - income,
         work = Recode(work, #work (0/1) codieren
                       "2 = 0"),
         age = Recode(se3a, #missing values l?schen
                      "-1 = NA"),
         demtoday = Recode(q91,
                           "-1 = NA;
                           97 = NA;
                           98 = NA;
                           99 = NA"),
         educ = Recode(educ,
                       "-1 = NA;
                           98 = NA;
                           99 = NA"),
         cntry = to_label(country),
         year = as.numeric(format(ir9,'%Y'))) %>%
  select(cntry,year,age,sex, income, educ, work, demtoday, trust_gov, trust_parliament,
         trust_police, trust_courts) %>%
#  mutate_at(vars(income, demtoday, educ, age,
#                 trust_gov, trust_parliament, 
#                 trust_police, trust_courts), 
#            as.character) %>%
#  mutate_at(vars(income, demtoday, educ, age,
#                 trust_gov, trust_parliament, 
#                 trust_police, trust_courts), 
#            as.numeric) %>%
  mutate_at(vars(income, demtoday, educ, 
                 trust_gov, trust_parliament, 
                 trust_police, trust_courts), 
            range01)
asian_3

Wave 4

European Social Survey

load(ESS_raw_url)
ESS <-ESS_raw %>% 
  rename(demtoday = dmcntov,
         age = agea,
         year = inwyys,
         trust_gov = trstplt,
         trust_parliament = trstprl,
         trust_police = trstplc,
         trust_courts = trstlgl) %>%
  mutate(income = 5 - hincfel,
         educ = Recode(eisced,
                          "55 = NA"),
         work = ifelse(mnactic == 1, 1, 0),
         sex = gndr - 1, #sex variable erstellen
         cntry = to_label(cntry)) %>%
  select(cntry,year,age,sex, income, educ, work, demtoday, trust_gov, trust_parliament,
         trust_police, trust_courts) %>%
#  mutate_at(vars(income, demtoday, educ, 
#                 trust_gov, trust_parliament, 
#                 trust_police, trust_courts), 
#            as.character) %>%
#  mutate_at(vars(income, demtoday, educ, 
#                 trust_gov, trust_parliament, 
#                 trust_police, trust_courts), 
#            as.numeric) %>%
  mutate_at(vars(income, demtoday, educ, 
                 trust_gov, trust_parliament, 
                 trust_police, trust_courts), 
            stdz) %>%
  mutate_at(vars(income, demtoday, educ, 
                 trust_gov, trust_parliament, 
                 trust_police, trust_courts), 
            range01)
ESS

Merging Everything

merged <- rbind(wvs,latino,afro,americas,asian,ESS)
merged <- merged %>%
  #create dummies
  mutate(wvs     = ifelse(survey=="wvs",1, 0),
        afro     = ifelse(survey=="afro",1, 0),
        latino   = ifelse(survey=="latino",1, 0),
        americas = ifelse(survey=="americas",1, 0),
        asian    = ifelse(survey=="asian",1, 0),
        ESS      = ifelse(survey=="ESS",1, 0)
        ) %>%
  #filter bad countries
  filter(cntry!="Egypt") %>% #exclude Egypt 2013
  filter(cntry!="Libya") %>% #exclude Libya 2014
  filter(cntry!="Mali") %>% #exclude Mali 2012
  filter(cntry!="Yemen") %>% #exclude Yemen 2012
  filter(cntry!="Palestine, State of") #exclude Palestine 2013
    # adding weight
merged <- merged %>%
  group_by(cntry) %>%
  tally() %>%
  mutate(weight = 1000/n) %>%
  select(cntry, weight) %>%
  left_join(merged, "cntry")
# select(cntry, year) %>%
# unique %>%
# View
merged

table(merged$wvs)

     0      1 
301009  80618 
table(merged$afro)

     0      1 
280893 100734 
table(merged$latino)

     0      1 
338714  42913 
table(merged$americas)

     0      1 
311125  70502 
table(merged$asian)

     0      1 
349440  32187 
table(merged$ESS)

     0      1 
326954  54673 

SEM Index

merged2 <- merged %>%
  mutate(gov_trust = trust_gov + trust_parliament + 
           trust_police + trust_courts) %>%
  filter(!is.na(gov_trust))
merged3 <- merged %>%
  mutate(gov_trust = trust_gov + trust_parliament + 
           trust_police + trust_courts) %>%
  filter(is.na(gov_trust))
svy.df <- survey::svydesign(id= ~1,
                              weights= ~weight,
                              data= merged) 
model <- '# measurement model 1
gov_trust2 =~ 1*trust_gov + trust_parliament + 
trust_police + trust_courts
trust_gov ~~ trust_parliament
'
merged <- merged %>%
  mutate_at(vars(trust_gov, trust_parliament,
                 trust_police, trust_courts), as.numeric)
# cor(na.omit(data.frame(merged$trust_gov,
#               merged$trust_police,
#               merged$trust_courts,
#               merged$trust_parliament,
#               merged$demtoday)))
lavaan_model1<-cfa(model, meanstructure = T, 
                   data = as.data.frame(merged),
                   estimator= "MLM")
fit_a1<-lavaan.survey(lavaan_model1, 
            estimator= "MLM", survey.design=svy.df)
summary(fit_a1, standardized=TRUE,fit.measures = TRUE, rsq = T)
lavaan (0.5-23.1097) converged normally after  38 iterations

  Number of observations                        339509

  Estimator                                         ML      Robust
  Minimum Function Test Statistic                4.858       2.577
  Degrees of freedom                                 1           1
  P-value (Chi-square)                           0.028       0.108
  Scaling correction factor                                  1.885
    for the Satorra-Bentler correction

Model test baseline model:

  Minimum Function Test Statistic           503887.369  334369.533
  Degrees of freedom                                 6           6
  P-value                                        0.000       0.000

User model versus baseline model:

  Comparative Fit Index (CFI)                    1.000       1.000
  Tucker-Lewis Index (TLI)                       1.000       1.000

  Robust Comparative Fit Index (CFI)                         1.000
  Robust Tucker-Lewis Index (TLI)                            1.000

Loglikelihood and Information Criteria:

  Loglikelihood user model (H0)             -159340.600  -159340.600
  Loglikelihood unrestricted model (H1)     -159338.171  -159338.171

  Number of free parameters                         13          13
  Akaike (AIC)                              318707.201  318707.201
  Bayesian (BIC)                            318846.759  318846.759
  Sample-size adjusted Bayesian (BIC)       318805.445  318805.445

Root Mean Square Error of Approximation:

  RMSEA                                          0.003       0.002
  90 Percent Confidence Interval          0.001  0.007       0.000  0.005
  P-value RMSEA <= 0.05                          1.000       1.000

  Robust RMSEA                                               0.003
  90 Percent Confidence Interval                             0.000  0.008

Standardized Root Mean Square Residual:

  SRMR                                           0.000       0.000

Parameter Estimates:

  Information                                 Expected
  Standard Errors                           Robust.sem

Latent Variables:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
  gov_trust2 =~                                                         
    trust_gov         1.000                               0.208    0.613
    trust_parlimnt    1.015    0.003  330.156    0.000    0.211    0.653
    trust_police      1.099    0.004  253.511    0.000    0.228    0.700
    trust_courts      1.315    0.005  247.330    0.000    0.273    0.847

Covariances:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
 .trust_gov ~~                                                          
   .trust_parlimnt    0.029    0.000  123.012    0.000    0.029    0.438

Intercepts:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
   .trust_gov         0.484    0.001  715.884    0.000    0.484    1.428
   .trust_parlimnt    0.456    0.001  703.812    0.000    0.456    1.414
   .trust_police      0.536    0.001  822.959    0.000    0.536    1.644
   .trust_courts      0.515    0.001  796.359    0.000    0.515    1.595
    gov_trust2        0.000                               0.000    0.000

Variances:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
   .trust_gov         0.072    0.000  259.086    0.000    0.072    0.624
   .trust_parlimnt    0.060    0.000  226.846    0.000    0.060    0.573
   .trust_police      0.054    0.000  218.146    0.000    0.054    0.510
   .trust_courts      0.029    0.000  107.510    0.000    0.029    0.282
    gov_trust2        0.043    0.000  148.215    0.000    1.000    1.000

R-Square:
                   Estimate
    trust_gov         0.376
    trust_parlimnt    0.427
    trust_police      0.490
    trust_courts      0.718
merged4<-cbind(merged2, predict(fit_a1, newdata = merged2))
merged4$gov_trust2<-range01(merged4$gov_trust2)
# head(merged4)
merged<-plyr::rbind.fill(merged3,merged4)
merged$gov_trust<-merged$gov_trust2
head(merged)

Some Recoding

table(merged$cntry,merged$year)
                                                      
                                                       1582 1583 2000 2010 2011 2012 2013 2014 2015
  Albania                                                 0    0    0    0    0  615  586    0    0
  Algeria                                                 0    0    0    0    0    0 2404    0 1200
  Argentina                                               0    0    0    0    0    0 2230    0 1200
  Armenia                                                 0    0    0    0 1100    0    0    0    0
  Australia                                               0    0    0    0    0 1477    0    0    0
  Azerbaijan                                              0    0    0    0 1002    0    0    0    0
  Bahamas                                                 0    0    0    0    0    0    0 3429    0
  Bahrain                                                 0    0    0    0    0    0    0 1200    0
  Barbados                                                0    0    0    0    0    0    0 3828    0
  Belarus                                                 0    0    0    0 1535    0    0    0    0
  Belgium                                                 0    0    0    0    0 1869    0    0    0
  Belize                                                  0    0    0    0    0 1512    0 1533    0
  Benin                                                   0    0    0    0 1200    0    0 1200    0
  Bolivia (Plurinational State of)                        0    0    0    0    0 3029 1200    0 1200
  Botswana                                                0    0    0    0    0 1200    0 1200    0
  Brazil                                                  0    0    0    0    0 1499 1204 2986 1250
  Bulgaria                                                0    0    0    0    0    0 2260    0    0
  Burkina Faso                                            0    0    0    0    0 1200    0    0 1200
  Burundi                                                 0    0    0    0    0 1200    0 1200    0
  Cabo Verde                                              0    0    0    0 1208    0    0 1200    0
  Cambodia                                                0    0    0    0    0 1200    0    0 2400
  Cameroon                                                0    0    0    0    0    0 1200    0 1182
  Canada                                                  0    0    0 1500    0    0    0    0    0
  Chile                                                   0    0    0    0 1000    0 1200    0 1200
  China                                                   0    3    1    0 3408 2360    0    0    0
  Colombia                                                0    0    0    0    0 3024 1200 1496 1200
  Costa Rica                                              0    0    0    0    0 1498 1000 1537 1000
  Côte D'Ivoire                                           0    0    0    0    0    0 1200 1199    0
  Cyprus                                                  0    0    0    0 1000 1089   27    0    0
  Czech Republic                                          0    0    0    0    0    0 2009    0    0
  Denmark                                                 0    0    0    0    0    0 1650    0    0
  Dominican Republic                                      0    0    0    0    0 1512 1000 1520 1000
  Ecuador                                                 0    0    0    0    0 1500 2402    0 1200
  El Salvador                                             0    0    0    0    0 1497 1000 1512 1000
  Estonia                                                 0    0    0    0 1533 2279  101    0    0
  Finland                                                 0    0    0    0    0 1884  313    0    0
  France                                                  0    0    0    0    0    0 1968    0    0
  Gabon                                                   0    0    0    0    0    0    0    0 1198
  Georgia                                                 0    0    0    0    0    0    0 1202    0
  Germany                                                 0    0    0    0    0 2753 2251    0    0
  Ghana                                                   0    0    0    0    0 3952    0 2400    0
  Guatemala                                               0    0    0    0    0 1509 1000 1506 1000
  Guinea                                                  0    0    0    0    0    0 1200    0 1200
  Guyana                                                  0    0    0    0    0 1529    0 1557    0
  Honduras                                                0    0    0    0    0 1728 1000 1561 1000
  Hong Kong                                               0    0    0    0    0 1207 1000    0    0
  Hungary                                                 0    0    0    0    0 1895  119    0    0
  Iceland                                                 0    0    0    0    0  601  151    0    0
  India                                                   0    0    0    0    0    0    0 1581    0
  Indonesia                                               0    0    0    0 1550    0    0    0    0
  Iraq                                                    0    0    0    0    0 1200    0    0    0
  Ireland                                                 0    0    0    0    0  995 1633    0    0
  Israel                                                  0    0    0    0    0 2229  279    0    0
  Italy                                                   0    0    0    0    0    0  960    0    0
  Jamaica                                                 0    0    0    0    0 1500    0 1503    0
  Japan                                                   0    0    0 2443 1880    0    0    0    0
  Jordan                                                  0    0    0    0    0    0    0 1200    0
  Kazakhstan                                              0    0    0    0 1500    0    0    0    0
  Kenya                                                   0    0    0    0 2399    0    0 2397    0
  Kosovo                                                  0    0    0    0    0    0 1295    0    0
  Kuwait                                                  0    0    0    0    0    0    0 1303    0
  Kyrgyzstan                                              0    0    0    0 1500    0    0    0    0
  Lebanon                                                 0    0    0    0    0    0 1200    0    0
  Lesotho                                                 0    0    0    0    0 1197    0 1200    0
  Liberia                                                 0    0    0    0    0 1199    0    0 1199
  Lithuania                                               0    0    0    0    0    0 2109    0    0
  Madagascar                                              0    0    0    0    0    0 1200 1015  185
  Malawi                                                  0    0    0    0    0 2407    0 2400    0
  Malaysia                                                0    0    0    0 1214 1300    0 1207    0
  Mauritius                                               0    0    0    0    0 1200    0 1200    0
  Mexico                                                  0    0    0    0    0 3560 1200 1535 1200
  Mongolia                                                0    0    0 1210    0    0    0 1228    0
  Morocco                                                 0    0    0    0 1200    0 1196    0 1200
  Mozambique                                              0    0    0    0    0 2400    0    0 2400
  Myanmar                                                 0    0    0    0    0    0    0    0 1620
  Namibia                                                 0    0    0    0    0 1200    0 1200    0
  Netherlands                                             0    0    0    0    0 3381  366    0    0
  New Zealand                                             0    0    0    0  841    0    0    0    0
  Nicaragua                                               0    0    0    0    0 1686 1000 1546 1000
  Niger                                                   0    0    0    0    0    0 1199    0 1200
  Nigeria                                                 0    0    0    0 1759 2364   36 2319   81
  Norway                                                  0    0    0    0    0 1446  178    0    0
  Pakistan                                                0    0    0    0    0 1200    0    0    0
  Panama                                                  0    0    0    0    0 1620 1000 1508 1000
  Paraguay                                                0    0    0    0    0 1510 1200 1503 1200
  Peru                                                    0    0    0    0    0 2710 1200 1500 1200
  Philippines                                             0    0    0 1200    0 1200    0 1200    0
  Poland                                                  0    0    0    0    0 2851   13    0    0
  Portugal                                                0    0    0    0    0  395 1756    0    0
  Qatar                                                   0    0    0 1060    0    0    0    0    0
  Republic of Korea                                       0    0    0 1200 1207    0    0    0 1200
  Romania                                                 0    0    0    0    0 1503    0    0    0
  Russian Federation                                      0    0    0    0 2500 2484    0    0    0
  Rwanda                                                  0    0    0    0    0 1527    0    0    0
  Sao Tome and Principe                                   0    0    0    0    0    0    0    0 1196
  Senegal                                                 0    0    0    0    0    0 1200 1200    0
  Sierra Leone                                            0    0    0    0    0 1190    0    0 1191
  Singapore                                            1000    0    0    0    0 1972    0  993   46
  Slovakia                                                0    0    0    0    0 1415  432    0    0
  Slovenia                                                0    0    0    0 1069 1257    0    0    0
                                                      
                                                       2077
  Albania                                                 0
  Algeria                                                 0
  Argentina                                               0
  Armenia                                                 0
  Australia                                               0
  Azerbaijan                                              0
  Bahamas                                                 0
  Bahrain                                                 0
  Barbados                                                0
  Belarus                                                 0
  Belgium                                                 0
  Belize                                                  0
  Benin                                                   0
  Bolivia (Plurinational State of)                        0
  Botswana                                                0
  Brazil                                                  0
  Bulgaria                                                0
  Burkina Faso                                            0
  Burundi                                                 0
  Cabo Verde                                              0
  Cambodia                                                0
  Cameroon                                                0
  Canada                                                  0
  Chile                                                   0
  China                                                   1
  Colombia                                                0
  Costa Rica                                              0
  Côte D'Ivoire                                           0
  Cyprus                                                  0
  Czech Republic                                          0
  Denmark                                                 0
  Dominican Republic                                      0
  Ecuador                                                 0
  El Salvador                                             0
  Estonia                                                 0
  Finland                                                 0
  France                                                  0
  Gabon                                                   0
  Georgia                                                 0
  Germany                                                 0
  Ghana                                                   0
  Guatemala                                               0
  Guinea                                                  0
  Guyana                                                  0
  Honduras                                                0
  Hong Kong                                               0
  Hungary                                                 0
  Iceland                                                 0
  India                                                   0
  Indonesia                                               0
  Iraq                                                    0
  Ireland                                                 0
  Israel                                                  0
  Italy                                                   0
  Jamaica                                                 0
  Japan                                                   0
  Jordan                                                  0
  Kazakhstan                                              0
  Kenya                                                   0
  Kosovo                                                  0
  Kuwait                                                  0
  Kyrgyzstan                                              0
  Lebanon                                                 0
  Lesotho                                                 0
  Liberia                                                 0
  Lithuania                                               0
  Madagascar                                              0
  Malawi                                                  0
  Malaysia                                                0
  Mauritius                                               0
  Mexico                                                  0
  Mongolia                                                0
  Morocco                                                 0
  Mozambique                                              0
  Myanmar                                                 0
  Namibia                                                 0
  Netherlands                                             0
  New Zealand                                             0
  Nicaragua                                               0
  Niger                                                   0
  Nigeria                                                 0
  Norway                                                  0
  Pakistan                                                0
  Panama                                                  0
  Paraguay                                                0
  Peru                                                    0
  Philippines                                             0
  Poland                                                  0
  Portugal                                                0
  Qatar                                                   0
  Republic of Korea                                       0
  Romania                                                 0
  Russian Federation                                      0
  Rwanda                                                  0
  Sao Tome and Principe                                   0
  Senegal                                                 0
  Sierra Leone                                            0
  Singapore                                               0
  Slovakia                                                0
  Slovenia                                                0
 [ reached getOption("max.print") -- omitted 24 rows ]
table(subset(merged,merged$cntry=="China")$survey,
      subset(merged,merged$cntry=="China")$year)
       
        1583 2000 2011 2012 2077
  asian    3    1 3408   60    1
  wvs      0    0    0 2300    0
merged$year[merged$cntry=="China" & merged$year == 1583] <- 2011
merged$year[merged$cntry=="China" & merged$year == 2000] <- 2011
merged$year[merged$cntry=="China" & merged$year == 2077] <- 2011
merged$year[merged$cntry=="China" & merged$year == 2012] <- 2011
table(subset(merged,merged$cntry=="Singapore")$survey,
      subset(merged,merged$cntry=="Singapore")$year)
       
        1582 2012 2014 2015
  asian 1000    0  993   46
  wvs      0 1972    0    0
merged$year[merged$cntry=="Singapore" & merged$year == 1582] <- 2011
hist(merged$gov_trust)

Level 2 Data

V-Dem

load(vdems_start_url)
vdems_sub <- vdems_start %>% filter(year %in% 2000:2010)
#tibble(id = 1:1896)
#table(vdems_sub$country_name)
vdem <- vdems_start %>%
  filter(year %in% 2000:2010) %>% 
  group_by(country_name) %>%
  tally %>%
  mutate(cntry = unique(country_name)) %>%
  #DCI Variables
  mutate(delib10 = vdems_sub %>%
           dcast(country_name ~ year, 
                 value.var=c("v2xdl_delib")) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>%
  mutate(consult10 = vdems_sub %>% 
           dcast(country_name ~ year, 
                 value.var=c("v2dlconslt")) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>%
  mutate(reason10 = vdems_sub %>% 
           dcast(country_name ~ year, 
                 value.var=c("v2dlreason")) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>%
  mutate(common10 = vdems_sub %>% 
           dcast(country_name ~ year, 
                 value.var=c("v2dlcommon")) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>%
  mutate(countr10 = vdems_sub %>% 
           dcast(country_name ~ year, 
                 value.var=c("v2dlcountr")) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>%
  mutate(engage10 = vdems_sub %>% 
           dcast(country_name ~ year, 
                 value.var=c("v2dlengage")) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>%
  mutate(delibdem10 = vdems_sub %>% 
           dcast(country_name ~ year, 
                 value.var=c("v2x_delibdem")) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>%
  # Control Variables
  mutate(polity10 = vdems_sub %>% 
           dcast(country_name ~ year, 
                 value.var=c("e_fh_ipolity2")) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>%
  mutate(gdp10 = vdems_sub %>% 
           dcast(country_name ~ year, 
                 value.var=c("e_GDP_Per_Cap_Haber_Men_2")) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>%
  mutate(riw10 = vdems_sub %>% 
           dcast(country_name ~ year, 
                 value.var=c("e_v2x_regime_ci")) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>%
  mutate(corecivil10 = vdems_sub %>% 
           dcast(country_name ~ year, 
                 value.var=c("v2xcs_ccsi")) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>%
  mutate(pop10 = vdems_sub %>% 
           dcast(country_name ~ year, 
                 value.var=c("e_mipopula")) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>%
  mutate(corruption10 = vdems_sub %>% 
           dcast(country_name ~ year, 
                 value.var=c("v2x_corr")) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>%
  mutate(polkill10 = vdems_sub %>% 
           dcast(country_name ~ year, 
                 value.var=c("v2x_clphy")) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>%
  mutate(educ10 = vdems_sub %>% 
           dcast(country_name ~ year, 
                 value.var=c("e_peaveduc")) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>%
  mutate(gini10 = vdems_sub %>% 
           dcast(country_name ~ year, 
                 value.var=c("e_peginiwi")) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>% 
  # Dummy variables
  mutate(pol_round = round(polity10 * 2 -10)) %>% 
  mutate(polity_demdummy = ifelse(pol_round > 5, 1, 0)) %>% 
  mutate(polity_anodummy = ifelse(pol_round >= -5 & pol_round <= 5, 1, 0)) %>% 
  mutate(polity_autodummy = ifelse(pol_round < -5, 1, 0)) %>% 
  mutate(regime = case_when(
    polity_autodummy == 1 ~ "auto",
    polity_anodummy == 1 ~ "ano",
    polity_demdummy == 1 ~ "demo"
    )
  ) %>%
  mutate(regime = factor(regime, levels = c("demo", "ano", "auto"))) %>% 
  mutate(cntry = countrycode(cntry,"country.name.en","country.name.en"))
Some values were not matched unambiguously: Democratic Republic of Vietnam
vdem$cntry[40] <- "Viet Nam"
# ifelse(round(vdem$polity10 * 2 -10) >= -5 & round(vdem$polity10 * 2 -10) <= 5, 1, 0)
table(vdem$regime)

demo  ano auto 
  72   77   18 
print(levels(vdem$regime)) 
[1] "demo" "ano"  "auto"
  

To Do

QoG

load(qog_url)
qog10 <- qog %>% 
  filter(year %in% 2000:2010) %>% 
  mutate(cntry = countrycode(ccodecow, "cown","country.name.en"))
qog10 <- qog %>% 
  filter(year %in% 2000:2010) %>% 
  mutate(cntry = countrycode(ccodecow, "cown","country.name.en")) %>% 
  group_by(cntry) %>%
  tally() %>% 
  mutate(ethnic10 = qog10 %>%
           dcast(cntry ~ year, 
                 value.var=c("al_ethnic"), 
          fun.aggregate = mean) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>% 
  select(-n)
#  mutate(al_ethnic = as.numeric(al_ethnic)) %>% 
qog10

Merging Time

Level 2

level2 <- merge(x=qog10, y=vdem, by="cntry")
level2

Ind + Country

vdem2 <- vdems_start %>%
  filter(year %in% 2010:2015) %>% 
  mutate(cntry = countrycode(country_name,"country.name.en","country.name.en")) #%>% 
Some values were not matched unambiguously: Democratic Republic of Vietnam
 # select(cntry, country_name)
vdem2$cntry[996] <- "Viet Nam"
vdem2$cntry[997] <- "Viet Nam"
vdem2$cntry[998] <- "Viet Nam"
vdem2$cntry[999] <- "Viet Nam"
vdem2$cntry[1000] <- "Viet Nam"
vdem2$cntry[1001] <- "Viet Nam"
combined <- vdem2 %>% 
  mutate(cntryears = paste(cntry, year)) %>% 
  mutate(discuss_unsel = v2xcl_disc) %>% 
  select(cntryears, discuss_unsel) %>% 
  merge(combined, by = "cntryears") %>% 
                  plyr::ddply(~cntry,
                        summarise, 
                        discuss = mean(discuss_unsel, na.rm=T)) %>% 
  merge(combined, by = "cntry")
combined
To Do

Crap




compare_cntry<-data.frame(table(merged$cntry,merged$year))
compare_cntry<-tidyr::spread(compare_cntry,Var2,Freq)
compare_cntry[compare_cntry==0]<-100000
#compare_cntry<-na.omit(compare_cntry)
indie<-as.numeric(apply(compare_cntry[,-1],1,sum))
compare_cntry$double<-indie<900000
compare_cntry[compare_cntry==100000]<-0
compare_cntry2 <- subset(compare_cntry,compare_cntry$double==TRUE)

compare_cntry3 <- subset(merged,merged$cntry %in% compare_cntry2$Var1)

y1<-subset(compare_cntry3,compare_cntry3$cntry=="Belize" &
                      compare_cntry3$year==2012)$gov_trust

y2<-subset(compare_cntry3,compare_cntry3$cntry=="Belize" &
         compare_cntry3$year==2014)$gov_trust

t.test(y1,y2)

y1<-subset(compare_cntry3,compare_cntry3$cntry=="Bolivia (Plurinational State of)" &
             compare_cntry3$year==2012)$gov_trust

y2<-subset(compare_cntry3,compare_cntry3$cntry=="Bolivia (Plurinational State of)" &
             compare_cntry3$year==2013)$gov_trust

t.test(y1,y2)

y1<-subset(compare_cntry3,compare_cntry3$cntry=="South Africa" &
             compare_cntry3$year==2011)$gov_trust

y2<-subset(compare_cntry3,compare_cntry3$cntry=="South Africa" &
             compare_cntry3$year==2013)$gov_trust

t.test(y1,y2)

       
subset(merged,merged$year==2012)

library(dplyr)
compare_cntry4 <- compare_cntry3 %>%
  group_by(cntry,year) %>%
  summarise_all(funs(mean(., na.rm=TRUE)))

compare_cntry4$cntryear<-paste(compare_cntry4$cntry,compare_cntry4$year)
  
as.data.frame(compare_cntry4[,c(17,8)])
  
?ddply
head(afro)

afrocntry<-unique(afro$cntry)
latinocntry<-unique(latino2013$cntry)
arabcntry<-unique(arab3$cntry)
wvscntry<-unique(wvs$cntry)

cntry_table<- data.frame(as.character(wvscntry),
                         c(as.character(arabcntry),rep("-",48)),
                         c(as.character(latinocntry),rep("-",41)),
                         c(as.character(afrocntry),rep("-",24)))

colnames(cntry_table) <- c("wvs","arab","latino","afro")

arrange(cntry_table, wvs, afro)



table(combined$politcat.x)
mplusdata <- combined %>% dplyr::select(cntry, delib10, demtoday, 
                                        trust_gov, trust_parliament, 
                                        trust_police,trust_courts,weight)
mplusdata <- na.omit(mplusdata)
mplusdata$cntry <- as.numeric(mplusdata$cntry)
write_csv(mplusdata, path = "mplusdata.csv", col_names = F)

mplusdata2 <- combined %>% dplyr::select(cntry, delib10, demtoday, 
                                        gov_trust,weight)
mplusdata2 <- na.omit(mplusdata2)
mplusdata2$cntry <- as.numeric(mplusdata2$cntry)
write_csv(mplusdata2, path = "mplusdat2a.csv", col_names = F)

mplusdata2_dem <- combined_dem %>% dplyr::select(cntry, delib10, demtoday, 
                                         gov_trust,weight)
mplusdata2_dem <- na.omit(mplusdata2_dem)
mplusdata2_dem$cntry <- as.numeric(mplusdata2_dem$cntry)
write_csv(mplusdata2_dem, path = "mplusdat2_dema.csv", col_names = F)

mplusdata2_aut <- combined_aut %>% dplyr::select(cntry, delib10, demtoday, 
                                         gov_trust,weight)
mplusdata2_aut <- na.omit(mplusdata2_aut)
mplusdata2_aut$cntry <- as.numeric(mplusdata2_aut$cntry)
write_csv(mplusdata2_aut, path = "mplusdat2_auta.csv", col_names = F)

combined <- merge(combined, physi2_s, by = "cntry")

combined_dem <- subset(combined,combined$polity_demdummy==1)

mplusdata_dem <- combined_dem %>% dplyr::select(cntry, delib10, demtoday, 
                                        trust_gov, trust_parliament, 
                                        trust_police,trust_courts,weight)
mplusdata_dem <- na.omit(mplusdata_dem)
mplusdata_dem$cntry <- as.numeric(mplusdata_dem$cntry)
write_csv(mplusdata_dem, path = "mplusdata_dem.csv", col_names = F)


combined_aut <- subset(combined,combined$polity_demdummy==0)

mplusdata_aut <- combined_aut %>% dplyr::select(cntry, delib10, demtoday, 
                                                trust_gov, trust_parliament, 
                                                trust_police,trust_courts,weight)
mplusdata_aut <- na.omit(mplusdata_aut)
mplusdata_aut$cntry <- as.numeric(mplusdata_aut$cntry)
write_csv(mplusdata_aut, path = "mplusdata_aut.csv", col_names = F)


#data_wids <- dcast(merged, cntry~year, 
#                    value.var=c("year"))
#data_wids2 <- as.data.frame(lapply(data_wids[,-1],function(n) 0<n))
#data_wids3 <- as.data.frame(apply(data_wids2,2,as.numeric))
#data_wids3 <- cbind(data_wids[,1],data_wids3)
#names(data_wids3)[1]<-"cntry"
#table_stuff <- merge(data_wids3 ,table_stuff, by="cntry")

#table_stuff$polity10[table_stuff$cntry=="Tunisia"] <- 5.32382
#table_stuff2$polity10[table_stuff2$cntry=="Tunisia"] <- 5.32382

head(table_stuff)
cor(na.omit(data.frame(table_stuff$legit,table_stuff$legit2,table_stuff$legit3,
                       table_stuff$mean_gov)))

table_stuff$gni <- table_stuff$gni_c

table_stuff$gni_c[table_stuff$gni <= 1025] <- "low"
table_stuff$gni_c[table_stuff$gni > 1026 & table_stuff$gni <= 4035] <- "lower-middle"
table_stuff$gni_c[table_stuff$gni > 4036 & table_stuff$gni <= 12475] <- "upper-middle"
table_stuff$gni_c[table_stuff$gni > 12475] <- "high"

table_stuff$gni_c2 <- table_stuff$gni_c

table_stuff$gni_c2[table_stuff$gni_c == "lower-middle"] <- "low"
table_stuff$gni_c2[table_stuff$gni_c == "upper-middle"] <- "high"

table(table_stuff$gni_c)
table(table_stuff$gni_c2)

The cut-off points are HDI of less than 0.550
for low human development, 0.550-0.699 for medium human
development, 0.700-0.799 for high human development and
0.800 or greater for very high human development.

#table_stuff$hdi_c <- table_stuff$hdi

#table_stuff$hdi_c[table_stuff$hdi < 0.550] <- "low"
#table_stuff$hdi_c[table_stuff$hdi >= 0.550 & table_stuff$hdi <= 0.699] <- "medium"
#table_stuff$hdi_c[table_stuff$hdi >= 0.700 & table_stuff$hdi <= 0.899] <- "high"
#table_stuff$hdi_c[table_stuff$hdi >= 0.90] <- "very high"

#table(table_stuff$hdi_c)



table(round(table_stuff$terror))

table_stuff$mean_gov2 <- table_stuff$mean_gov
table_stuff$mean_gov2[is.na(table_stuff$mean_gov2)]<-999

table_stuff$mean_gov3 <- table_stuff$mean_gov
table_stuff$mean_gov3[is.na(table_stuff$mean_gov3)]<-999

table_stuff$mean_gov4 <- table_stuff$mean_gov
table_stuff$mean_gov4[is.na(table_stuff$mean_gov4)]<-999

table_stuff$mean_gov5 <- table_stuff$mean_gov
table_stuff$mean_gov5[is.na(table_stuff$mean_gov5)]<-999

table_stuff$mean_gov6 <- table_stuff$mean_gov
table_stuff$mean_gov6[is.na(table_stuff$mean_gov6)]<-999

table_stuff$mean_gov7 <- table_stuff$mean_gov
table_stuff$mean_gov7[is.na(table_stuff$mean_gov7)]<-999

table_stuff$mean_gov8 <- table_stuff$mean_gov
table_stuff$mean_gov8[is.na(table_stuff$mean_gov8)]<-999

table_stuff$mean_gov9 <- table_stuff$mean_gov
table_stuff$mean_gov9[is.na(table_stuff$mean_gov9)]<-999

table_stuff$physviol2 <- table_stuff$physviol
table_stuff$physviol2[is.na(table_stuff$physviol2)] <- 999

table_stuff$terror2 <- round(table_stuff$terror)
table_stuff$terror2[is.nan(table_stuff$terror2)] <- 999

table_stuff$discuss2 <- round(table_stuff$discuss*4)
table_stuff$discuss2[is.nan(table_stuff$discuss2)] <- 999



table(table_stuff$physviol)
table_stuff$mean_gov2[table_stuff$physviol2<=0.5 & table_stuff$physviol2>0.4] <- table_stuff$mean_gov2[table_stuff$physviol2<=0.5 & table_stuff$physviol2>0.4]-5
table_stuff$mean_gov2[table_stuff$physviol2<=0.4 & table_stuff$physviol2>0.3] <- table_stuff$mean_gov2[table_stuff$physviol2<=0.4 & table_stuff$physviol2>0.3]-10
table_stuff$mean_gov2[table_stuff$physviol2<=0.3 & table_stuff$physviol2>0.2] <- table_stuff$mean_gov2[table_stuff$physviol2<=0.3 & table_stuff$physviol2>0.2]-15
table_stuff$mean_gov2[table_stuff$physviol2<=0.2 & table_stuff$physviol2>0.1] <- table_stuff$mean_gov2[table_stuff$physviol2<=0.2 & table_stuff$physviol2>0.1]-20
table_stuff$mean_gov2[table_stuff$physviol2<=0.1 & table_stuff$physviol2>=0]  <- table_stuff$mean_gov2[table_stuff$physviol2<=0.1 & table_stuff$physviol2>=0]  -25

table_stuff$mean_gov2[table_stuff$mean_gov2>100] <- NA
table(table_stuff$mean_gov2)

table_stuff$mean_gov3[table_stuff$physviol2<=0.5 & table_stuff$physviol2>0.4] <- table_stuff$mean_gov3[table_stuff$physviol2<=0.5 & table_stuff$physviol2>0.4]-8
table_stuff$mean_gov3[table_stuff$physviol2<=0.4 & table_stuff$physviol2>0.3] <- table_stuff$mean_gov3[table_stuff$physviol2<=0.4 & table_stuff$physviol2>0.3]-16
table_stuff$mean_gov3[table_stuff$physviol2<=0.3 & table_stuff$physviol2>0.2] <- table_stuff$mean_gov3[table_stuff$physviol2<=0.3 & table_stuff$physviol2>0.2]-24
table_stuff$mean_gov3[table_stuff$physviol2<=0.2 & table_stuff$physviol2>0.1] <- table_stuff$mean_gov3[table_stuff$physviol2<=0.2 & table_stuff$physviol2>0.1] -32
table_stuff$mean_gov3[table_stuff$physviol2<=0.1 & table_stuff$physviol2>=0] <-  table_stuff$mean_gov3[table_stuff$physviol2<=0.1 & table_stuff$physviol2>=0]  -30

table_stuff$mean_gov3[table_stuff$mean_gov3>100] <- NA
table(table_stuff$mean_gov3)

table_stuff$mean_gov4[table_stuff$terror2==5] <- table_stuff$mean_gov4[table_stuff$terror2==5]-5
table_stuff$mean_gov4[table_stuff$terror2==4] <- table_stuff$mean_gov4[table_stuff$terror2==4]-10
table_stuff$mean_gov4[table_stuff$terror2==3] <- table_stuff$mean_gov4[table_stuff$terror2==3]-15

table_stuff$mean_gov4[table_stuff$mean_gov4>100] <- NA
table(table_stuff$mean_gov4)

table_stuff$mean_gov5[table_stuff$terror2==5] <- table_stuff$mean_gov5[table_stuff$terror2==5]-8
table_stuff$mean_gov5[table_stuff$terror2==4] <- table_stuff$mean_gov5[table_stuff$terror2==4]-16
table_stuff$mean_gov5[table_stuff$terror2==3] <- table_stuff$mean_gov5[table_stuff$terror2==3]-24

table_stuff$mean_gov5[table_stuff$mean_gov5>100] <- NA
table(table_stuff$mean_gov5)

table_stuff$mean_gov6[table_stuff$discuss2==2] <- table_stuff$mean_gov6[table_stuff$discuss2==2] -5
table_stuff$mean_gov6[table_stuff$discuss2==1] <- table_stuff$mean_gov6[table_stuff$discuss2==1] -10

table_stuff$mean_gov6[table_stuff$mean_gov6>100] <- NA
table(table_stuff$mean_gov6)

table_stuff$mean_gov7[table_stuff$discuss2==2] <- table_stuff$mean_gov7[table_stuff$discuss2==2] -10
table_stuff$mean_gov7[table_stuff$discuss2==1] <- table_stuff$mean_gov7[table_stuff$discuss2==1] -20

table_stuff$mean_gov7[table_stuff$mean_gov7>100] <- NA
table(table_stuff$mean_gov7)


load(qog_url)

qog10 <- subset(qog,qog$year==2000 |
                  qog$year==2001 |  
                  qog$year==2002 | 
                  qog$year==2003 | 
                  qog$year==2004 | 
                  qog$year==2005 | 
                  qog$year==2006 | 
                  qog$year==2007 | 
                  qog$year==2008 | 
                  qog$year==2009 |
                  qog$year==2010)

library(countrycode)
qog10$cntry<-countrycode(qog10$ccodecow, "cown","country.name.en")
qog10$al_ethnic<-as.numeric(qog10$al_ethnic)
#tidyr::gather(qog10,c("cntry","year"),"al_ethnic")

qog10a <- qog10 %>% dplyr::select(cntry,year,al_ethnic) %>%
  as.data.frame()
data_wide17 <- reshape(data = qog10a,
                       idvar = "cntry",
                       v.names = "al_ethnic",
                       timevar = "year",
                       direction = "wide")

#qog10hdi <- qog10 %>% dplyr::select(cntry,year,undp_hdi) %>%
#  as.data.frame()
#data_wide_hdi <- hdi
  #reshape(data = qog10hdi,
                      # idvar = "cntry",
                      # v.names = "undp_hdi",
                      # timevar = "year",
                      # direction = "wide")



table(qog$al_ethnic,qog$year)

qog14 <- subset(qog,qog$year==2014)
qog14$cntry<-countrycode(qog14$ccodecow, "cown","country.name.en")
qog14 <- qog14 %>% dplyr::select(cntry,year,cspf_legit) %>%
  as.data.frame()
data_wide18 <- reshape(data = qog14,
                       idvar = "cntry",
                       v.names = "cspf_legit",
                       timevar = "year",
                       direction = "wide")

qog15 <- subset(qog,qog$year==2015)
qog15$cntry<-countrycode(qog15$ccodecow, "cown","country.name.en")
qog15 <- qog15 %>% dplyr::select(cntry,year,ffp_sl) %>%
  as.data.frame()
data_wide19 <- reshape(data = qog15,
                       idvar = "cntry",
                       v.names = "ffp_sl",
                       timevar = "year",
                       direction = "wide")


qog10$ciri_physint<-as.numeric(qog10$ciri_physint)
qog10a <- qog10 %>% dplyr::select(cntry,year,ciri_physint) %>%
  as.data.frame()
data_wide20 <- reshape(data = qog10a,
                       idvar = "cntry",
                       v.names = "ciri_physint",
                       timevar = "year",
                       direction = "wide")

qog10$gd_ptss <-as.numeric(qog10$gd_ptss)
qog10a <- qog10 %>% dplyr::select(cntry,year,gd_ptss) %>%
  as.data.frame()
data_wide21 <- reshape(data = qog10a,
                       idvar = "cntry",
                       v.names = "gd_ptss",
                       timevar = "year",
                       direction = "wide")

qog14<-subset(qog,qog$year==2014)
qog13<-subset(qog,qog$year==2013)
qog12<-subset(qog,qog$year==2012)
qog11<-subset(qog,qog$year==2011)
qog10<-subset(qog,qog$year==2010)
qog8<-subset(qog,qog$year==2008)
qog7<-subset(qog,qog$year==2007)
qog6<-subset(qog,qog$year==2006)
qog5<-subset(qog,qog$year==2005)
qog4<-subset(qog,qog$year==2004)
qog3<-subset(qog,qog$year==2003)
qog2<-subset(qog,qog$year==2002)
qog1<-subset(qog,qog$year==2001)
qog0<-subset(qog,qog$year==2000)



table(is.na(qog$wel_culture),qog$year)
culreg<- pmax(qog14$wel_culture, qog13$wel_culture, na.rm = TRUE)
culreg<- pmax(culreg, qog12$wel_culture, na.rm = TRUE)
culreg<- pmax(culreg, qog11$wel_culture, na.rm = TRUE)
culreg<- pmax(culreg, qog10$wel_culture, na.rm = TRUE)
culreg<- pmax(culreg, qog8$wel_culture, na.rm = TRUE)
culreg<- pmax(culreg, qog7$wel_culture, na.rm = TRUE)
culreg<- pmax(culreg, qog6$wel_culture, na.rm = TRUE)
culreg<- pmax(culreg, qog5$wel_culture, na.rm = TRUE)
culreg<- pmax(culreg, qog4$wel_culture, na.rm = TRUE)
culreg<- pmax(culreg, qog3$wel_culture, na.rm = TRUE)
culreg<- pmax(culreg, qog2$wel_culture, na.rm = TRUE)
culreg<- pmax(culreg, qog1$wel_culture, na.rm = TRUE)
culreg<- pmax(culreg, qog0$wel_culture, na.rm = TRUE)
culreg<- as.character(sjmisc::to_label(culreg))
culreg<-as.data.frame(cbind(culreg,qog14$ccodecow))
oreast  <- subset(culreg, culreg$culreg == "Orthodox East")
oreast

#culreg<- pmax(culreg, qog10$wel_culture, na.rm = TRUE)

qog14$ht_region 

culreg$cntry<-countrycode(culreg$V2, "cown","country.name.en")
tabeletto<-merge(table_stuff,culreg,by="cntry")
tabeletto<-as.data.frame(cbind(table_stuff$regions,
                               as.character(table_stuff$cntry),
                               as.character(tabeletto$culreg)))
tabeletto <- tabeletto[order(tabeletto$V1, tabeletto$V3),]
#edit(tabeletto)

culreg<-data.frame(cbind(tabeletto,culreg))
culreg<-culreg[,c(2,4)]
names(culreg)[1]<-c("cntry")

table_stuff3 <- merge(table_stuff,culreg,by="cntry")

table(as.character(tabeletto$V3))

qog100 <- subset(qog,qog$year==2010)
qog100$cntry<-countrycode(sjmisc::to_label(qog100$ccodecow), "cown","country.name.en")
qog100 <- qog100 %>% dplyr::select(cntry,year,ht_regtype1) %>%
  as.data.frame()
qog100$regtype<-sjmisc::to_label(qog100$ht_regtype1)
qog100$year <- NULL
qog100$ht_regtype1 <- NULL
table(qog100$regtype)


ethnic10<-as.numeric(rowMeans(data_wide17[,2:12])) # mean over last 10 years (2000 - 2010)
physint10<-as.numeric(rowMeans(data_wide20[,2:12])) # mean over last 10 years (2000 - 2010)
terror10<-as.numeric(rowMeans(data_wide21[,2:12])) # mean over last 10 years (2000 - 2010)
legit<-as.numeric(data_wide18[,2]) # mean over last 10 years (2000 - 2010)
legit2<-as.numeric(data_wide19[,2]) # mean over last 10 years (2000 - 2010)
qogthingy<-data.frame(data_wide19[,1],ethnic10,legit,legit2,physint10,terror10)
colnames(qogthingy)[1]<-c("cntry")
qogthingy<-merge(x=qogthingy, y=qog100, by="cntry")

#qogthingy<-data.frame(data_wide17[,1],ethnic10)
#colnames(qogthingy)[1]<-c("cntry")
#combined <- merge(x=qogthingy, y=combined, by="cntry")


qog_cs <-read_spss("C:/Users/Favone/Downloads/qog_std_cs_jan17.sav") #loading dataset
qog_cs$cntry<-countrycode(qog_cs$ccodecow, "cown","country.name.en")
qog_cs$legit3<-as.numeric(qog_cs$gov_ixlegitimacyindex)

legit_dat<-data.frame(qog_cs$cntry,qog_cs$legit3)
colnames(legit_dat)<-c("cntry","legit3")

aggrdelib <- merge(x=legit_dat, y=aggrdelib, by="cntry")

aggrdelib$legit3 <- range01(aggrdelib$legit3)
cor(na.omit(aggrdelib[,c(4,5,7,13)]))
cor(na.omit(aggrdelib[,c(4,5,2,6:13)]))

aggrdelib$legit <- 1-range01(aggrdelib$legit)
aggrdelib$legit2 <- 1-range01(aggrdelib$legit2)
aggrdelib$asia <- aggrdelib$e.asia + aggrdelib$s.e.asia + aggrdelib$s.asia + aggrdelib$pacific

SFI <-read_spss("C:/Users/Favone/Downloads/SFIv2016.sav") #loading dataset
SFI <- subset(SFI,SFI$year==2015)
SFI$cntry <-countrycode(SFI$country, "country.name.en","country.name.en") 
SFI$cntry[79] <- "North Korea"
SFI$cntry <-countrycode(SFI$cntry, "country.name.en","country.name.en") 
SFI$legitimacy <- SFI$legit
SFI$legit <- NULL


aggrdelib <- merge(x=SFI, y=aggrdelib, by="cntry")

hdi <- read_csv("hdi.csv")
hdi$cntry<-countrycode(hdi$Country, "country.name.en","country.name.en")
hdi$'1990'<- NULL ; hdi$'1991'<- NULL ; hdi$'1992'<- NULL ; hdi$'1993'<- NULL
hdi$'1994'<- NULL; hdi$'1995'<- NULL; hdi$'1996'<- NULL; hdi$'1997'<- NULL
hdi$'1998'<- NULL ; hdi$'1999'<- NULL ; hdi$'2011'<- NULL ; hdi$'2012'<- NULL
hdi$'2013'<- NULL; hdi$'2014'<- NULL; hdi$'2015'<- NULL;hdi$`HDI Rank (2015)`<- NULL
hdi$Country<- NULL
hdi10<-as.numeric(rowMeans(hdi[,1:11])) 
hdat<-data.frame(hdi$cntry,hdi10) 
names(hdat)<-c("cntry","hdi10")

aggrdelib <- merge(x=hdat, y=aggrdelib, by="cntry")
#table(aggrdelib$hdi10)
#gc()
#combined <- merge(x=hdat, y=combined, by="cntry")


#colnames(aggrdelib)[9]<-"e_p_polity"
#lop<-subset(vdems_start,vdems_start$year==2010)

cor(na.omit(aggrdelib2[,2:17]))
cor(na.omit(data.frame(aggrdelib$polity10,aggrdelib$delib10)))

#hist(vdems$v2dlconslt)
#hist(vdems$v2xcl_disc)
#table(vdems_start$e_boix_regime,vdems_start$year)
#table(vdems_sub$e_p_polity,vdems_sub$year)

##### merging time ####

combined <- merge(x=merged, y=aggrdelib, by="cntry")
table(combined$cntry)

combined <- as.data.frame(combined)
combined$gov_trust <- as.numeric(combined$gov_trust)
combined$age <- as.numeric(combined$age)
combined$income <- as.numeric(combined$income)
combined$educ <- as.numeric(combined$educ)
combined$sex <- as.factor(combined$sex)
combined$authoritarian <- as.numeric(combined$authoritarian)
combined$safety <- as.numeric(combined$safety)
combined$demtoday <- as.numeric(combined$demtoday)
combined$latino <- factor(combined$latino)
combined$afro <- factor(combined$afro)
combined$americas <- factor(combined$americas)
combined$asia <- combined$e.asia + combined$s.e.asia + combined$s.asia + combined$pacific

cor(na.omit(data.frame(combined$gov_trust,combined$income,combined$educ, #Socioeconomic factors
                       combined$delib10, combined$polity10, combined$gdp10, combined$demtoday)))

combined$cntry<-as.factor(combined$cntry)


#combined$polity10 <- combined$polity10*20-10

#combined$regime <- combined$polity10
#combined$regime[combined$polity_autodummy==1] <- "auto"
#combined$regime[combined$polity_anodummy==1] <- "ano"
#combined$regime[combined$polity_demdummy==1] <- "demo"

hist(combined$gov_trust)
qplot(combined$gov_trust)

combined$cntry



#physi_s <- vdems_sub2 %>% dplyr::select(cntryears, franz)

#combined <- merge(combined, physi_s, by = "cntryears")

#physi2_s <- ddply(combined,~cntry,
#                summarise,politcat=mean(franz,na.rm=T))

#combined <- merge(combined, physi2_s, by = "cntry")


vdems_sub2$cntryears <- paste(vdems_sub2$cntry,vdems_sub2$year)

physi <- vdems_sub2 %>% dplyr::select(cntryears, perc)

combined <- merge(combined, physi, by = "cntryears")

physi2 <- ddply(combined,~cntry,
                     summarise,physviol=mean(perc,na.rm=T))

combined <- merge(combined, physi2, by = "cntry")





#physi_22$dis3 <-round(physi_22$dis2)

#unique(physi2_s$cntry)

#1-2.5
#3-5
#5.5 - 7
#physi2_s$politcat2<-8-((physi2_s$politcat) * (7/10))
#11 

#physi2_s$polity_demdummy <- physi2_s$politcat2
#physi2_s$polity_demdummy [physi2_s$politcat2 <= 2.5] <- 1
#physi2_s$polity_demdummy [physi2_s$politcat2 >  2.5] <- 0
#table(physi2_s$polity_demdummy)

#physi2_s$polity_anodummy <- physi2_s$politcat2
#physi2_s$polity_anodummy[physi2_s$politcat2 > 2.5 & physi2_s$politcat2 < 5.5] <- 1
#physi2_s$polity_anodummy[physi2_s$politcat2 <= 2.5 | physi2_s$politcat2 >= 5.5] <- 0
#table(physi2_s$polity_anodummy)

#physi2_s$polity_autodummy <- physi2_s$politcat2
#physi2_s$polity_autodummy[physi2_s$politcat2 >= 5.5] <- 1
#physi2_s$polity_autodummy[physi2_s$politcat2 < 5.5] <- 0
#table(physi2_s$polity_autodummy)

#physi2_s$regime <- physi2_s$politcat
#physi2_s$regime[physi2_s$polity_autodummy==1] <- "auto"
#physi2_s$regime[physi2_s$polity_anodummy==1] <- "ano"
#physi2_s$regime[physi2_s$polity_demdummy==1] <- "demo"

#unique(physi2_s$cntry)

table(physi2_s$regime)

qog2000 <- subset(qog,qog$year==2010 |
                       qog$year==2011 |  
                       qog$year==2012 | 
                       qog$year==2013 | 
                       qog$year==2014 | 
                       qog$year==2015)

table(qog2000$gd_ptsa,qog2000$year)

qog2000$perc2 <- qog2000$gd_ptsa

qog2000$cntry<-countrycode(qog2000$ccodecow, "cown","country.name.en")

qog2000$cntryears <- paste(qog2000$cntry,qog2000$year)

physi2000 <- qog2000 %>% dplyr::select(cntryears, perc2)

combined <- merge(combined, physi2000, by = "cntryears")

physi22000 <- ddply(combined,~cntry,
                summarise,terror=mean(perc2,na.rm=T))

combined <- merge(combined, physi22000, by = "cntry")

#table(qog2000$undp_hdi,qog2000$year)

#physiff <- qog2000 %>% dplyr::select(cntryears, undp_hdi)

#combined <- merge(combined, physiff, by = "cntryears")

#physiff2 <- ddply(combined,~cntry,
#                    summarise,hdi=mean(undp_hdi,na.rm=T))

#combined <- merge(combined, physiff2, by = "cntry")


gni <- read_csv("GNI.csv",  skip = 1)

gni$`2015`<-gsub("ttt","",gni$`2015`)
gni$`2015`<-gsub("ff","",gni$`2015`)
gni$`2015`<-gsub("sss","",gni$`2015`)
gni$`2015`<-gsub("uuu","",gni$`2015`)
gni$`2015`<-gsub("o","",gni$`2015`)
gni$`2015` <- as.numeric(gni$`2015`)

gni$`2014`<-gsub("ttt","",gni$`2014`)
gni$`2014`<-gsub("ff","",gni$`2014`)
gni$`2014`<-gsub("sss","",gni$`2014`)
gni$`2014`<-gsub("uuu","",gni$`2014`)
gni$`2014`<-gsub("o","",gni$`2014`)
gni$`2014` <- as.numeric(gni$`2014`)

gni<-gni[,c(2,23:28)]

gni<-gather(as.data.frame(gni),key = "Country")
names(gni) <- c("cntry","year","gni")

gni$cntry<-countrycode(gni$cntry,"country.name.en","country.name.en")
gni$cntryears <- paste(gni$cntry,gni$year)

physigni <- gni %>% dplyr::select(cntryears, gni)

combined <- merge(combined, physigni, by = "cntryears")

physigni2 <- ddply(combined,~cntry,
                    summarise,gni_c=mean(gni,na.rm=T))

combined <- merge(combined, physigni2, by = "cntry")
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQojIExvYWRpbmcgdGhlIFBhY2thZ2VzDQoNCmBgYHtyfQ0KbGlicmFyeShwYWNtYW4pDQoNCnBfbG9hZCh0aWR5dmVyc2UsIGhhdmVuLHNqbWlzYywNCiAgICAgICAgICAgICAgICAgICAgIGZvcmNhdHMsIHdlaWdodHMsIGNhciwNCiAgICAgICAgICAgICAgICAgICAgIGNvdW50cnljb2RlLCBsYXZhYW4sDQogICAgICAgICAgICAgICAgICAgICBzZW1Ub29scywgbGF2YWFuLnN1cnZleSwNCiAgICAgICAgICAgICAgICAgICAgIHN1cnZleSwgcmVzaGFwZTIsIGZhdnN0YXRzKQ0KYGBgDQoNCiMgTG9hZGluZyB0aGUgVVJMcw0KDQpgYGB7cn0NCmFmcm81X3VybCAgICAgICAgPC11cmwoJ2h0dHBzOi8vZ2l0aHViLmNvbS9mYXZzdGF0cy9kYXRhYmFzZV9kZWxpYi9yYXcvL21hc3Rlci9hZnJvNS5SRGF0YScpDQphZnJvNl91cmwgICAgICAgIDwtdXJsKCdodHRwczovL2dpdGh1Yi5jb20vZmF2c3RhdHMvZGF0YWJhc2VfZGVsaWIvcmF3Ly9tYXN0ZXIvYWZybzYuUkRhdGEnKQ0KDQpsYXRpbm8yMDEzX3VybCAgIDwtdXJsKCdodHRwczovL2dpdGh1Yi5jb20vZmF2c3RhdHMvZGF0YWJhc2VfZGVsaWIvcmF3Ly9tYXN0ZXIvbGF0aW5vMjAxMy5SRGF0YScpDQpsYXRpbm8yMDE1X3VybCAgIDwtdXJsKCdodHRwczovL2dpdGh1Yi5jb20vZmF2c3RhdHMvZGF0YWJhc2VfZGVsaWIvcmF3Ly9tYXN0ZXIvbGF0aW5vMjAxNS5SRGF0YScpDQoNCnd2c19yYXdfdXJsICAgICAgPC11cmwoJ2h0dHBzOi8vZ2l0aHViLmNvbS9mYXZzdGF0cy9kYXRhYmFzZV9kZWxpYi9yYXcvL21hc3Rlci93dnNfcmF3LlJEYXRhJykNCg0KYW1lcmljYXNfdXJsICAgICA8LXVybCgnaHR0cHM6Ly9naXRodWIuY29tL2ZhdnN0YXRzL2RhdGFiYXNlX2RlbGliL3Jhdy8vbWFzdGVyL2FtZXJpY2FzLlJEYXRhJykNCmJvbGl2aWFfdXJsICAgICAgPC11cmwoJ2h0dHBzOi8vZ2l0aHViLmNvbS9mYXZzdGF0cy9kYXRhYmFzZV9kZWxpYi9yYXcvL21hc3Rlci9ib2xpdmlhLlJEYXRhJykNCmNhbmFkYV91cmwgICAgICAgPC11cmwoJ2h0dHBzOi8vZ2l0aHViLmNvbS9mYXZzdGF0cy9kYXRhYmFzZV9kZWxpYi9yYXcvL21hc3Rlci9jYW5hZGEuUkRhdGEnKQ0KDQphc2lhbl9yYXdfdXJsICAgIDwtdXJsKCdodHRwczovL2dpdGh1Yi5jb20vZmF2c3RhdHMvZGF0YWJhc2VfZGVsaWIvcmF3Ly9tYXN0ZXIvYXNpYW5fcmF3LlJEYXRhJykNCm15YW5tYXJfcmF3X3VybCAgPC11cmwoJ2h0dHBzOi8vZ2l0aHViLmNvbS9mYXZzdGF0cy9kYXRhYmFzZV9kZWxpYi9yYXcvL21hc3Rlci9teWFubWFyX3Jhdy5SRGF0YScpDQptb25nb2xpYV9yYXdfdXJsIDwtdXJsKCdodHRwczovL2dpdGh1Yi5jb20vZmF2c3RhdHMvZGF0YWJhc2VfZGVsaWIvcmF3Ly9tYXN0ZXIvbW9uZ29saWFfcmF3LlJEYXRhJykNCnBoaWxpcF9yYXdfdXJsICAgPC11cmwoJ2h0dHBzOi8vZ2l0aHViLmNvbS9mYXZzdGF0cy9kYXRhYmFzZV9kZWxpYi9yYXcvL21hc3Rlci9waGlsaXBfcmF3LlJEYXRhJykNCnRhaXdhbl9yYXdfdXJsICAgPC11cmwoJ2h0dHBzOi8vZ2l0aHViLmNvbS9mYXZzdGF0cy9kYXRhYmFzZV9kZWxpYi9yYXcvL21hc3Rlci90YWl3YW5fcmF3LlJEYXRhJykNCnRoYWlfcmF3X3VybCAgICAgPC11cmwoJ2h0dHBzOi8vZ2l0aHViLmNvbS9mYXZzdGF0cy9kYXRhYmFzZV9kZWxpYi9yYXcvL21hc3Rlci90aGFpX3Jhdy5SRGF0YScpDQptYWxheV9yYXdfdXJsICAgIDwtdXJsKCdodHRwczovL2dpdGh1Yi5jb20vZmF2c3RhdHMvZGF0YWJhc2VfZGVsaWIvcmF3Ly9tYXN0ZXIvbWFsYXlfcmF3LlJEYXRhJykNCnNpbmdhcG9yZV9yYXdfdXJsPC11cmwoJ2h0dHBzOi8vZ2l0aHViLmNvbS9mYXZzdGF0cy9kYXRhYmFzZV9kZWxpYi9yYXcvL21hc3Rlci9zaW5nYXBvcmVfcmF3LlJEYXRhJykNCnNrX3Jhd191cmwgICAgICAgPC11cmwoJ2h0dHBzOi8vZ2l0aHViLmNvbS9mYXZzdGF0cy9kYXRhYmFzZV9kZWxpYi9yYXcvL21hc3Rlci9za19yYXcuUkRhdGEnKQ0KY2FtYm9kaWFfcmF3X3VybCA8LXVybCgnaHR0cHM6Ly9naXRodWIuY29tL2ZhdnN0YXRzL2RhdGFiYXNlX2RlbGliL3Jhdy8vbWFzdGVyL2NhbWJvZGlhX3Jhdy5SRGF0YScpDQoNCkVTU19yYXdfdXJsICAgICAgPC11cmwoJ2h0dHBzOi8vZ2l0aHViLmNvbS9mYXZzdGF0cy9kYXRhYmFzZV9kZWxpYi9ibG9iL21hc3Rlci9FU1NfcmF3LlJkYXRhP3Jhdz10cnVlJykNCg0KdmRlbXNfc3RhcnRfdXJsICA8LXVybCgnaHR0cHM6Ly9naXRodWIuY29tL2ZhdnN0YXRzL2RhdGFiYXNlX2RlbGliL3Jhdy8vbWFzdGVyL3ZkZW1zX3N0YXJ0LlJkYXRhJykNCg0KcW9nX3VybCAgICAgICAgICA8LXVybCgnaHR0cHM6Ly9naXRodWIuY29tL2ZhdnN0YXRzL2RhdGFiYXNlX2RlbGliL3Jhdy8vbWFzdGVyL3FvZy5SZGF0YScpDQoNCmBgYA0KDQoNCiMgQWZyb2Jhcm9tZXRlciBEYXRhDQoNCiMjIEFmcm8gNQ0KDQpgYGB7cn0NCmxvYWQoYWZybzVfdXJsKQ0KDQpkZWxldGVfbmFfYWZybyA8LSBmdW5jdGlvbih4KSB7DQogIHg8LVJlY29kZSh4LCAiOSA9IE5BOw0KICAgICAgICAgICAgOTggPSBOQTsNCiAgICAgICAgICAgIDk5ID0gTkE7DQogICAgICAgICAgICAtMSA9IE5BIikNCiAgcmV0dXJuKHgpDQp9ICNGdW5rdGlvbiB1bSBkaWUgTkFzIGltIEFmcm8gRGF0ZW5zYXR6IHp1IGJlc3RpbW1lbg0KDQojIGFsbGUgVmFyaWFibGVuDQphZnJvXzUgPC0gYWZybzUgICU+JSANCiAgcmVuYW1lKGVkdWMgPSBROTcsICAgICAgICAgICNWYXJpYWJsZW4gdW1iZW5lbm5lbg0KICAgICAgICAgaW5jb21lID0gUTNCLCANCiAgICAgICAgIHNleCA9IFExMDEsIA0KICAgICAgICAgd29yayA9IFE5NiwNCiAgICAgICAgIHRydXN0X2dvdiA9IFE1OUEsDQogICAgICAgICB0cnVzdF9wYXJsaWFtZW50ID0gUTU5QiwNCiAgICAgICAgIHRydXN0X3BvbGljZSA9IFE1OUgsDQogICAgICAgICB0cnVzdF9jb3VydHMgPSBRNTlKLA0KICAgICAgICAgZGVtdG9kYXkgPSBRNDZBKSAlPiUNCiAgbXV0YXRlX2F0KHZhcnMoaW5jb21lLCB0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsIA0KICAgICAgICAgICAgICAgICB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cywgd29yayksIA0KICAgICAgICAgICAgZGVsZXRlX25hX2Fmcm8pICU+JSAgICNOQXMgZGVsZXRlbiANCiAgbXV0YXRlKHNleCA9IHNleCAtIDEsICAgI3NleCAoMC8xKSBjb2RpZXJlbg0KICAgICAgICAgd29yayA9IFJlY29kZSh3b3JrLCAjd29yayAoMC8xKSBjb2RpZXJlbg0KICAgICAgICAgICAgICAgICAgICAgICAiMSA9IDA7DQogICAgICAgICAgICAgICAgICAyID0gMTsNCiAgICAgICAgICAgICAgICAgIDMgPSAxIiksDQogICAgICAgICBhZ2UgPSBSZWNvZGUoUTEsICNtaXNzaW5nIHZhbHVlcyBsP3NjaGVuDQogICAgICAgICAgICAgICAgICAgICAgIi0xID0gTkE7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTk4ID0gTkE7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTk5ID0gTkEiKSwNCiAgICAgICAgIGRlbXRvZGF5ID0gUmVjb2RlKGRlbXRvZGF5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0xID0gTkE7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk4ID0gTkE7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk5ID0gTkEiKSwNCiAgICAgICAgIGVkdWMgPSBSZWNvZGUoZWR1YywNCiAgICAgICAgICAgICAgICAgICAgICAgIi0xID0gTkE7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk4ID0gTkE7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk5ID0gTkE7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTk5ID0gTkEiKSwNCiAgICAgICAgIGNudHJ5ID0gdG9fbGFiZWwoQ09VTlRSWV9BTFBIQSksDQogICAgICAgICB5ZWFyID0gYXMubnVtZXJpYyhmb3JtYXQoREFURUlOVFIsJyVZJykpKSAlPiUNCiAgc2VsZWN0KGNudHJ5LHllYXIsYWdlLHNleCwgaW5jb21lLCBlZHVjLCB3b3JrLCBkZW10b2RheSwgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LA0KICAgICAgICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMpICU+JQ0KICBtdXRhdGVfYXQodmFycyhpbmNvbWUsIGRlbXRvZGF5LCBlZHVjLCANCiAgICAgICAgICAgICAgICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LCANCiAgICAgICAgICAgICAgICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMpLCANCiAgICAgICAgICAgIHJhbmdlMDEpDQoNCmFmcm9fNQ0KYGBgDQoNCiMjIEFmcm8gNg0KDQpgYGB7cn0NCmxvYWQoYWZybzZfdXJsKQ0KDQphZnJvXzYgPC0gYWZybzYgJT4lDQogIHJlbmFtZShlZHVjID0gUTk3LCANCiAgICAgICAgIGluY29tZSA9IFE0QiwgDQogICAgICAgICBzZXggPSBRMTAxLCANCiAgICAgICAgIHdvcmsgPSBROTUsDQogICAgICAgICB0cnVzdF9nb3YgPSBRNTJBLA0KICAgICAgICAgdHJ1c3RfcGFybGlhbWVudCA9IFE1MkIsDQogICAgICAgICB0cnVzdF9wb2xpY2UgPSBRNTJILA0KICAgICAgICAgdHJ1c3RfY291cnRzID0gUTUySiwNCiAgICAgICAgIGRlbXRvZGF5ID0gUTQwKSU+JQ0KICBtdXRhdGVfYXQodmFycyhpbmNvbWUsIGRlbXRvZGF5LCB0cnVzdF9nb3YsIA0KICAgICAgICAgICAgICAgICB0cnVzdF9wYXJsaWFtZW50LCB0cnVzdF9wb2xpY2UsIA0KICAgICAgICAgICAgICAgICB0cnVzdF9jb3VydHMsIHdvcmspLCANCiAgICAgICAgICAgIGRlbGV0ZV9uYV9hZnJvKSAlPiUgICAjTkFzIGRlbGV0ZW4gDQogIG11dGF0ZShzZXggPSBzZXggLSAxLCAgICNzZXggKDAvMSkgY29kaWVyZW4NCiAgICAgICAgIHdvcmsgPSBSZWNvZGUod29yaywgI3dvcmsgKDAvMSkgY29kaWVyZW4NCiAgICAgICAgICAgICAgICAgICAgICAgIjEgPSAwOw0KICAgICAgICAgICAgICAgICAgICAgICAyID0gMTsNCiAgICAgICAgICAgICAgICAgICAgICAgMyA9IDEiKSwNCiAgICAgICAgIGFnZSA9IFJlY29kZShRMSwgI21pc3NpbmcgdmFsdWVzIGw/c2NoZW4NCiAgICAgICAgICAgICAgICAgICAgICAiLTEgPSBOQTsNCiAgICAgICAgICAgICAgICAgICAgICA5OTggPSBOQTsNCiAgICAgICAgICAgICAgICAgICAgICA5OTkgPSBOQSIpLA0KICAgICAgICAgZWR1YyA9IFJlY29kZShlZHVjLA0KICAgICAgICAgICAgICAgICAgICAgICAiLTEgPSBOQTsNCiAgICAgICAgICAgICAgICAgICAgICAgOTggPSBOQTsNCiAgICAgICAgICAgICAgICAgICAgICAgOTkgPSBOQTsNCiAgICAgICAgICAgICAgICAgICAgICAgOTk5ID0gTkEiKSwNCiAgICAgICAgIGRlbXRvZGF5ID0gUmVjb2RlKGRlbXRvZGF5LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICI4ID0gTkEiKSwNCiAgICAgICAgIGNudHJ5ID0gdG9fbGFiZWwoQ09VTlRSWV9SNUxpc3QpLA0KICAgICAgICAgeWVhciA9IGFzLm51bWVyaWMoZm9ybWF0KERBVEVJTlRSLCclWScpKSkgJT4lDQogIHNlbGVjdChjbnRyeSx5ZWFyLGFnZSxzZXgsIGluY29tZSwgDQogICAgICAgICBlZHVjLCB3b3JrLCBkZW10b2RheSwgDQogICAgICAgICB0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsIA0KICAgICAgICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMpICU+JQ0KIyAgbXV0YXRlX2F0KHZhcnMoaW5jb21lLCBkZW10b2RheSwgZWR1YywgYWdlLA0KIyAgICAgICAgICAgICAgICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LCANCiMgICAgICAgICAgICAgICAgIHRydXN0X3BvbGljZSwgdHJ1c3RfY291cnRzKSwgDQojICAgICAgICAgICAgYXMuY2hhcmFjdGVyKSAlPiUNCiMgIG11dGF0ZV9hdCh2YXJzKGluY29tZSwgZGVtdG9kYXksIGVkdWMsIGFnZSwNCiMgICAgICAgICAgICAgICAgIHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwgDQojICAgICAgICAgICAgICAgICB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cyksIA0KIyAgICAgICAgICAgIGFzLm51bWVyaWMpICU+JQ0KICBtdXRhdGVfYXQodmFycyhpbmNvbWUsIGRlbXRvZGF5LCBlZHVjLCANCiAgICAgICAgICAgICAgICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LCANCiAgICAgICAgICAgICAgICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMpLCANCiAgICAgICAgICAgIHJhbmdlMDEpDQphZnJvXzYNCg0KYGBgDQoNCiMjIE1lcmdpbmcgdGhlIERhdGENCg0KYGBge3J9DQphZnJvX3JlYWwgPC0gYWZyb181ICU+JSBzZWxlY3QoY250cnkseWVhciwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZHVjLGluY29tZSxzZXgsYWdlLHdvcmssDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVtdG9kYXksdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVzdF9wb2xpY2UsdHJ1c3RfY291cnRzKQ0KDQphZnJvX3JlYWwyIDwtIGFmcm9fNiAlPiUgc2VsZWN0KGNudHJ5LHllYXIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkdWMsaW5jb21lLHNleCxhZ2Usd29yaywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVtdG9kYXksdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1c3RfcG9saWNlLHRydXN0X2NvdXJ0cykNCiNsZW5ndGgodW5pcXVlKGFmcm9fcmVhbCRjbnRyeSkpDQojbGVuZ3RoKHVuaXF1ZShhZnJvX3JlYWwyJGNudHJ5KSkNCiN0YWJsZShhZnJvX3JlYWwyJHllYXIpDQoNCmFmcm8gPC0gcmJpbmQoYWZyb19yZWFsLGFmcm9fcmVhbDIpICU+JSBhcy50YmwoKQ0KDQphZnJvDQpgYGANCg0KIyBMYXRpbm8gQmFyb21ldHJvDQoNCiMjIExhdGlubyAyMDEzDQoNCmBgYHtyfQ0KbG9hZChsYXRpbm8yMDEzX3VybCkNCg0KbGF0aW5vXzIwMTMgPC1sYXRpbm8yMDEzICU+JSANCiAgcmVuYW1lKGVkdWMgPSBSRUVEVUNfMSwNCiAgICAgICAgIGluY29tZSA9IFM2LA0KICAgICAgICAgZGVtdG9kYXkgPSBQNTBUR0IuQSwNCiAgICAgICAgIGFnZSA9IFMxMSkgJT4lDQogIG11dGF0ZShzZXggPSBTMTAgLSAxLCAjc2V4IHZhcmlhYmxlIGVyc3RlbGxlbg0KICAgICAgICAgY250cnkgPSB0b19sYWJlbChJREVOUEEpLCAjY250cnkgdmFyaWFibGUgZXJzdGVsbGVuDQogICAgICAgICB0cnVzdF9nb3YgPSA1LVAyNlRHQi5CLA0KICAgICAgICAgdHJ1c3RfcGFybGlhbWVudCA9IDUtUDI2VEdCLkMsDQogICAgICAgICB0cnVzdF9wb2xpY2UgPSA1LVAyOFRHQi5CLA0KICAgICAgICAgdHJ1c3RfY291cnRzID0gNS1QMjZUR0IuRSwNCiAgICAgICAgIHllYXIgPSAyMDEzLA0KICAgICAgICAgaW5jb21lID0gNSAtIGluY29tZSwNCiAgICAgICAgIHdvcmsgPSBSZWNvZGUoUzE5LkEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiMiA9IDE7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgMyA9IDE7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgNCA9IDA7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgNSA9IDA7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgNiA9IDA7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgNyA9IDAiKSkgJT4lDQogIHNlbGVjdChjbnRyeSx5ZWFyLGFnZSxzZXgsIGluY29tZSwgZWR1Yywgd29yaywgZGVtdG9kYXksIHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwNCiAgICAgICAgIHRydXN0X3BvbGljZSwgdHJ1c3RfY291cnRzKSAlPiUNCiMgIG11dGF0ZV9hdCh2YXJzKGluY29tZSwgZGVtdG9kYXksIGVkdWMsIA0KIyAgICAgICAgICAgICAgICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LCANCiMgICAgICAgICAgICAgICAgIHRydXN0X3BvbGljZSwgdHJ1c3RfY291cnRzKSwgDQojICAgICAgICAgICAgYXMuY2hhcmFjdGVyKSAlPiUNCiMgIG11dGF0ZV9hdCh2YXJzKGluY29tZSwgZGVtdG9kYXksIGVkdWMsIA0KIyAgICAgICAgICAgICAgICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LCANCiMgICAgICAgICAgICAgICAgIHRydXN0X3BvbGljZSwgdHJ1c3RfY291cnRzKSwgDQojICAgICAgICAgICAgYXMubnVtZXJpYykgJT4lDQogIG11dGF0ZV9hdCh2YXJzKGluY29tZSwgZGVtdG9kYXksIGVkdWMsIA0KICAgICAgICAgICAgICAgICB0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsIA0KICAgICAgICAgICAgICAgICB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cyksIA0KICAgICAgICAgICAgcmFuZ2UwMSkNCiAgDQpsYXRpbm9fMjAxMw0KYGBgDQoNCiMjIExhdGlubyAyMDE1DQoNCmBgYHtyfQ0KbG9hZChsYXRpbm8yMDE1X3VybCkNCg0KbGF0aW5vXzIwMTUgPC1sYXRpbm8yMDE1ICU+JSANCiAgbXV0YXRlKHNleCA9IFMxMiAtIDEpICU+JSAjc2V4IHZhcmlhYmxlIGVyc3RlbGxlbg0KICByZW5hbWUoZWR1YyA9IFJFRURVQ18xLA0KICAgICAgICAgaW5jb21lID0gUzQsDQogICAgICAgICBkZW10b2RheSA9IFAxN1NUR0JTLA0KICAgICAgICAgYWdlID0gUzEzKSAlPiUNCiAgbXV0YXRlKHRydXN0X2dvdiA9IDUtUDE2U1QuRywNCiAgICAgICAgIHRydXN0X3BhcmxpYW1lbnQgPSA1LVAxNlNULkYsDQogICAgICAgICB0cnVzdF9wb2xpY2UgPSA1LVAxNlRHQi5CLA0KICAgICAgICAgdHJ1c3RfY291cnRzID0gNS1QMTZTVC5ILA0KICAgICAgICAgd29yayA9IFJlY29kZShTMjEuQSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICIyID0gMTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAzID0gMTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ID0gMDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA1ID0gMDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA2ID0gMDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA3ID0gMCIpLA0KICAgICAgICAgY250cnkgPSB0b19sYWJlbChJREVOUEEpLA0KICAgICAgICAgaW5jb21lID0gNSAtIGluY29tZSwNCiAgICAgICAgIHllYXIgPSAyMDE1KSAlPiUNCiAgc2VsZWN0KGNudHJ5LHllYXIsYWdlLHNleCwgaW5jb21lLCBlZHVjLCB3b3JrLCBkZW10b2RheSwgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LA0KICAgICAgICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMpICU+JQ0KIyAgbXV0YXRlX2F0KHZhcnMoaW5jb21lLCBkZW10b2RheSwgZWR1YywgDQojICAgICAgICAgICAgICAgICB0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsIA0KIyAgICAgICAgICAgICAgICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMpLCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLmNoYXJhY3RlcikgJT4lDQojICBtdXRhdGVfYXQodmFycyhpbmNvbWUsIGRlbXRvZGF5LCBlZHVjLCANCiMgICAgICAgICAgICAgICAgIHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwgDQojICAgICAgICAgICAgICAgICB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cyksIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMubnVtZXJpYykgJT4lDQogIG11dGF0ZV9hdCh2YXJzKGluY29tZSwgZGVtdG9kYXksIGVkdWMsIA0KICAgICAgICAgICAgICAgICB0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsIA0KICAgICAgICAgICAgICAgICB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cyksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZTAxKQ0KDQpsYXRpbm9fMjAxNQ0KYGBgDQoNCiMjIE1lcmdpbmcgdGhlIERhdGENCg0KYGBge3J9DQpsYXRpbm9fcmVhbCA8LSBsYXRpbm9fMjAxMyAlPiUgc2VsZWN0KGNudHJ5LHllYXIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkdWMsaW5jb21lLHNleCxhZ2Usd29yaywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVtdG9kYXksdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1c3RfcG9saWNlLHRydXN0X2NvdXJ0cykNCg0KbGF0aW5vX3JlYWwyIDwtIGxhdGlub18yMDE1ICU+JSBzZWxlY3QoY250cnkseWVhciwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkdWMsaW5jb21lLHNleCxhZ2Usd29yaywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbXRvZGF5LHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVzdF9wb2xpY2UsdHJ1c3RfY291cnRzKQ0KI2xlbmd0aCh1bmlxdWUoYWZyb19yZWFsJGNudHJ5KSkNCiNsZW5ndGgodW5pcXVlKGFmcm9fcmVhbDIkY250cnkpKQ0KI3RhYmxlKGFmcm9fcmVhbDIkeWVhcikNCg0KbGF0aW5vIDwtIHJiaW5kKGxhdGlub19yZWFsLGxhdGlub19yZWFsMikgJT4lIGFzLnRibCgpDQoNCmxhdGlubw0KDQpgYGANCg0KDQoNCiMgV29ybGQgVmFsdWUgU3VydmV5DQoNCmBgYHtyfQ0KbG9hZCh3dnNfcmF3X3VybCkNCg0Kd3ZzIDwtd3ZzX3JhdyAlPiUgDQogIHJlbmFtZShlZHVjID0gVjI0OCwNCiAgICAgICAgIGluY29tZSA9IFYyMzksDQogICAgICAgICBkZW10b2RheSA9IFYxNDEsDQogICAgICAgICBhZ2UgPSBWMjQyLA0KICAgICAgICAgeWVhciA9IFYyNjIpICU+JQ0KICBtdXRhdGUoc2V4ID0gVjI0MCAtMSwgICNzZXggdmFyaWFibGUgZXJzdGVsbGVuDQogICAgICAgICB0cnVzdF9nb3YgPSA1LVYxMTUsDQogICAgICAgICB0cnVzdF9wYXJsaWFtZW50ID0gNS1WMTE3LA0KICAgICAgICAgdHJ1c3RfcG9saWNlID0gNS1WMTEzLA0KICAgICAgICAgdHJ1c3RfY291cnRzID0gNS1WMTE0LA0KICAgICAgICAgd29yayA9IFJlY29kZShWMjI5LA0KICAgICAgICAgICAgICAgICAgICAgICAiMiA9IDE7DQogICAgICAgICAgICAgICAgICAgICAgIDMgPSAxOw0KICAgICAgICAgICAgICAgICAgICAgICA0ID0gMDsNCiAgICAgICAgICAgICAgICAgICAgICAgNSA9IDA7DQogICAgICAgICAgICAgICAgICAgICAgIDYgPSAwOw0KICAgICAgICAgICAgICAgICAgICAgICA3ID0gMDsNCiAgICAgICAgICAgICAgICAgICAgICAgOCA9IDAiKSwNCiAgICAgICAgIGNudHJ5ID0gdG9fbGFiZWwoVjIpKSAlPiUNCiAgc2VsZWN0KGNudHJ5LHllYXIsYWdlLHNleCwgaW5jb21lLCBlZHVjLCB3b3JrLCBkZW10b2RheSwgDQogICAgICAgICB0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsDQogICAgICAgICB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cykgJT4lDQogIG11dGF0ZV9hdCh2YXJzKGluY29tZSwgZGVtdG9kYXksIGVkdWMsIA0KICAgICAgICAgICAgICAgICB0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsIA0KICAgICAgICAgICAgICAgICB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cyksIA0KICAgICAgICAgICAgYXMuY2hhcmFjdGVyKSAlPiUNCiAgbXV0YXRlX2F0KHZhcnMoaW5jb21lLCBkZW10b2RheSwgZWR1YywgDQogICAgICAgICAgICAgICAgIHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwgDQogICAgICAgICAgICAgICAgIHRydXN0X3BvbGljZSwgdHJ1c3RfY291cnRzKSwgDQogICAgICAgICAgICBhcy5udW1lcmljKSAlPiUNCiAgbXV0YXRlX2F0KHZhcnMoaW5jb21lLCBkZW10b2RheSwgZWR1YywgDQogICAgICAgICAgICAgICAgIHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwgDQogICAgICAgICAgICAgICAgIHRydXN0X3BvbGljZSwgdHJ1c3RfY291cnRzKSwgDQogICAgICAgICAgICByYW5nZTAxKQ0KDQoNCg0Kd3ZzDQpgYGANCg0KIyBBbWVyaWNhcyBCYXJvbWV0ZXINCg0KIyMgQW1lcmljYXMgTWFpbg0KDQpgYGB7cn0NCmxvYWQoYW1lcmljYXNfdXJsKQ0KDQphbWVyaWNhc18gPC0gYW1lcmljYXMgJT4lDQogIG11dGF0ZShjbnRyeSA9IHRvX2xhYmVsKHBhaXMpKSAlPiUNCiAgc2VsZWN0KGNudHJ5LCBvY3VwNGEsIGVkLCBxMTBuZXcsIHExLCBxMiwgDQogICAgICAgICBiMTBhLCBiMTMsIGIxOCwgYjIxYSwgbjMsIHllYXIpICU+JQ0KICByZW5hbWUod29yayA9IG9jdXA0YSwNCiAgICAgICAgIGVkdWMgPSBlZCwNCiAgICAgICAgIGluY29tZSA9IHExMG5ldywNCiAgICAgICAgIHNleCA9IHExLA0KICAgICAgICAgYWdlID0gcTIsDQogICAgICAgICB0cnVzdF9jb3VydHMgPSBiMTBhLA0KICAgICAgICAgdHJ1c3RfcGFybGlhbWVudCA9IGIxMywNCiAgICAgICAgIHRydXN0X3BvbGljZSA9IGIxOCwNCiAgICAgICAgIHRydXN0X2dvdiA9IGIyMWEsDQogICAgICAgICBkZW10b2RheSA9IG4zKSAlPiUNCiAgbXV0YXRlKHNleCA9IHNleCAtMSwgICNzZXggdmFyaWFibGUgZXJzdGVsbGVuDQogICAgICAgICB3b3JrID0gUmVjb2RlKHdvcmssDQogICAgICAgICAgICAgICAgICAgICAgIjIgPSAxOw0KICAgICAgICAgICAgICAgICAgICAgICAzID0gMTsNCiAgICAgICAgICAgICAgICAgICAgICAgNCA9IDA7DQogICAgICAgICAgICAgICAgICAgICAgIDUgPSAwOw0KICAgICAgICAgICAgICAgICAgICAgICA2ID0gMDsNCiAgICAgICAgICAgICAgICAgICAgICAgNyA9IDAiKSkgJT4lDQogIG11dGF0ZV9hdCh2YXJzKGluY29tZSwgZGVtdG9kYXksIGVkdWMsIA0KICAgICAgICAgICAgICAgICB0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsIA0KICAgICAgICAgICAgICAgICB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cyksIA0KICAgICAgICAgICAgcmFuZ2UwMSkNCg0KYW1lcmljYXNfDQpgYGANCg0KDQojIyBCb2xpdmlhDQoNCmBgYHtyfQ0KbG9hZChib2xpdmlhX3VybCkNCg0KYm9saXZpYV8gPC0gYm9saXZpYSAlPiUNCiAgbXV0YXRlKGNudHJ5ID0gdG9fbGFiZWwocGFpcykpICU+JQ0KICBzZWxlY3QoY250cnksIG9jdXA0YSwgZWQsIHExMG5ldywgcTEsIHEyLCANCiAgICAgICAgIGIxMGEsIGIxMywgYjE4LCBiMjFhLCBuMywgeWVhcikgJT4lDQogIHJlbmFtZSh3b3JrID0gb2N1cDRhLA0KICAgICAgICAgZWR1YyA9IGVkLA0KICAgICAgICAgaW5jb21lID0gcTEwbmV3LA0KICAgICAgICAgc2V4ID0gcTEsDQogICAgICAgICBhZ2UgPSBxMiwNCiAgICAgICAgIHRydXN0X2NvdXJ0cyA9IGIxMGEsDQogICAgICAgICB0cnVzdF9wYXJsaWFtZW50ID0gYjEzLA0KICAgICAgICAgdHJ1c3RfcG9saWNlID0gYjE4LA0KICAgICAgICAgdHJ1c3RfZ292ID0gYjIxYSwgI3ZpZWxlIG1pc3NpbmcgdmFsdWVzDQogICAgICAgICBkZW10b2RheSA9IG4zKSAlPiUNCiAgbXV0YXRlKHNleCA9IHNleCAtMSwgICNzZXggdmFyaWFibGUgZXJzdGVsbGVuDQogICAgICAgICB3b3JrID0gUmVjb2RlKHdvcmssDQogICAgICAgICAgICAgICAgICAgICAgICIyID0gMTsNCiAgICAgICAgICAgICAgICAgICAgICAgMyA9IDE7DQogICAgICAgICAgICAgICAgICAgICAgIDQgPSAwOw0KICAgICAgICAgICAgICAgICAgICAgICA1ID0gMDsNCiAgICAgICAgICAgICAgICAgICAgICAgNiA9IDA7DQogICAgICAgICAgICAgICAgICAgICAgIDcgPSAwIikpICU+JQ0KICBtdXRhdGVfYXQodmFycyhpbmNvbWUsIGRlbXRvZGF5LCBlZHVjLCANCiAgICAgICAgICAgICAgICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LCANCiAgICAgICAgICAgICAgICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMpLCANCiAgICAgICAgICAgIHJhbmdlMDEpICAgICAgICANCg0KYm9saXZpYV8NCmBgYA0KDQojIyBDYW5hZGENCg0KYGBge3J9DQpsb2FkKGNhbmFkYV91cmwpDQoNCmNhbmFkYV8gPC0gY2FuYWRhICU+JQ0KICBtdXRhdGUoY250cnkgPSB0b19sYWJlbChwYWlzKSkgJT4lDQogIHNlbGVjdChjbnRyeSwgZXhjMTMsIGVkdWNhdGlvbiwgcTEwLCBxMSwgcTIsIA0KICAgICAgICAgYjEwYSwgYjEzLCBiMTgsIGIyMWEsIG4zLCB5ZWFyKSAlPiUNCiAgcmVuYW1lKHdvcmsgPSBleGMxMywNCiAgICAgICAgIGVkdWMgPSBlZHVjYXRpb24sDQogICAgICAgICBpbmNvbWUgPSBxMTAsDQogICAgICAgICBzZXggPSBxMSwNCiAgICAgICAgIGFnZSA9IHEyLA0KICAgICAgICAgdHJ1c3RfY291cnRzID0gYjEwYSwNCiAgICAgICAgIHRydXN0X3BhcmxpYW1lbnQgPSBiMTMsDQogICAgICAgICB0cnVzdF9wb2xpY2UgPSBiMTgsDQogICAgICAgICB0cnVzdF9nb3YgPSBiMjFhLA0KICAgICAgICAgZGVtdG9kYXkgPSBuMykgJT4lDQogIG11dGF0ZShzZXggPSBzZXggLTEsICAjc2V4IHZhcmlhYmxlIGVyc3RlbGxlbg0KICAgICAgICAgd29yayA9IHdvcmsgLSAxLA0KICAgICAgICAgaW5jb21lID0gaWZlbHNlKGluY29tZSA9PSA4OCwgTkEsIGluY29tZSkpICU+JQ0KICBtdXRhdGVfYXQodmFycyhpbmNvbWUsIGRlbXRvZGF5LCBlZHVjLCANCiAgICAgICAgICAgICAgICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LCANCiAgICAgICAgICAgICAgICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMpLCANCiAgICAgICAgICAgIHJhbmdlMDEpICAgICAgICANCg0KY2FuYWRhXw0KYGBgDQoNCiMjIE1lcmdpbmcgdGhlIERhdGENCg0KYGBge3J9DQphbWVyaWNhcyA8LSBhbWVyaWNhc18gJT4lIGRwbHlyOjpzZWxlY3QoY250cnkseWVhciwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkdWMsaW5jb21lLHNleCxhZ2Usd29yaywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbXRvZGF5LHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVzdF9wb2xpY2UsdHJ1c3RfY291cnRzKQ0KDQpib2xpdmlhIDwtIGJvbGl2aWFfICU+JSBkcGx5cjo6c2VsZWN0KGNudHJ5LHllYXIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkdWMsaW5jb21lLHNleCxhZ2Usd29yaywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVtdG9kYXksdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1c3RfcG9saWNlLHRydXN0X2NvdXJ0cykNCg0KY2FuYWRhIDwtIGNhbmFkYV8gJT4lIGRwbHlyOjpzZWxlY3QoY250cnkseWVhciwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWR1YyxpbmNvbWUsc2V4LGFnZSx3b3JrLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZW10b2RheSx0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVzdF9wb2xpY2UsdHJ1c3RfY291cnRzKQ0KDQoNCmFtZXJpY2FzIDwtIHJiaW5kKGFtZXJpY2FzLGJvbGl2aWEsY2FuYWRhKQ0KDQphbWVyaWNhcw0KYGBgDQoNCiMgQXNpYW4gQmFyb21ldGVyDQoNCmBgYHtyfQ0KbG9hZChhc2lhbl9yYXdfdXJsKQ0KDQpkZWxldGVfbmFfYXNpYW4gPC0gZnVuY3Rpb24oeCkgew0KICB4PC1SZWNvZGUoeCwNCiAgICAgICAgICAgICItMiA9IE5BOw0KICAgICAgICAgICAgNyA9IE5BOw0KICAgICAgICAgICAgOCA9IE5BOw0KICAgICAgICAgICAgOSA9IE5BOw0KICAgICAgICAgICAgOTcgPSBOQTsNCiAgICAgICAgICAgIDk4ID0gTkE7DQogICAgICAgICAgICA5OSA9IE5BOw0KICAgICAgICAgICAgLTEgPSBOQSIpDQogIA0KICByZXR1cm4oeCkNCn0gI0Z1bmt0aW9uIHVtIGRpZSBOQXMgaW0gYXNpYW4gRGF0ZW5zYXR6IHp1IGJlc3RpbW1lbg0KDQphc2lhbl8zIDwtIGFzaWFuX3JhdyAlPiUNCiAgcmVuYW1lKGVkdWMgPSBzZTUsDQogICAgICAgICB0cnVzdF9nb3YgPSBxOSwNCiAgICAgICAgIHRydXN0X3BhcmxpYW1lbnQgPSBxMTEsDQogICAgICAgICB0cnVzdF9wb2xpY2UgPSBxMTQsDQogICAgICAgICB0cnVzdF9jb3VydHMgPSBxOCwNCiAgICAgICAgIHNleCA9IHNlMiwNCiAgICAgICAgIGluY29tZSA9IHNlMTNhLA0KICAgICAgICAgd29yayA9IHNlOSkgJT4lDQogIG11dGF0ZV9hdCh2YXJzKGluY29tZSwgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LCANCiAgICAgICAgICAgICAgICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMsIHdvcmssIHNleCksIA0KICAgICAgICAgICAgZGVsZXRlX25hX2FzaWFuKSAlPiUgICAjTkFzIGRlbGV0ZW4gDQogIG11dGF0ZSh0cnVzdF9nb3YgPSA1IC0gdHJ1c3RfZ292LA0KICAgICAgICAgdHJ1c3RfcGFybGlhbWVudCA9IDUgLSB0cnVzdF9wYXJsaWFtZW50LA0KICAgICAgICAgdHJ1c3RfcG9saWNlID0gNSAtIHRydXN0X3BvbGljZSwNCiAgICAgICAgIHRydXN0X2NvdXJ0cyA9IDUgLSB0cnVzdF9jb3VydHMsDQogICAgICAgICBzZXggPSBzZXggLSAxLCAgICNzZXggKDAvMSkgY29kaWVyZW4NCiAgICAgICAgIGluY29tZSA9IFJlY29kZShpbmNvbWUsDQogICAgICAgICAgICAgICAgICAgICAgICAgIjAgPSBOQSIpLA0KICAgICAgICAgaW5jb21lID0gNSAtIGluY29tZSwNCiAgICAgICAgIHdvcmsgPSBSZWNvZGUod29yaywgI3dvcmsgKDAvMSkgY29kaWVyZW4NCiAgICAgICAgICAgICAgICAgICAgICAgIjIgPSAwIiksDQogICAgICAgICBhZ2UgPSBSZWNvZGUoc2UzYSwgI21pc3NpbmcgdmFsdWVzIGw/c2NoZW4NCiAgICAgICAgICAgICAgICAgICAgICAiLTEgPSBOQSIpLA0KICAgICAgICAgZGVtdG9kYXkgPSBSZWNvZGUocTkxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0xID0gTkE7DQogICAgICAgICAgICAgICAgICAgICAgICAgICA5NyA9IE5BOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgOTggPSBOQTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDk5ID0gTkEiKSwNCiAgICAgICAgIGVkdWMgPSBSZWNvZGUoZWR1YywNCiAgICAgICAgICAgICAgICAgICAgICAgIi0xID0gTkE7DQogICAgICAgICAgICAgICAgICAgICAgICAgICA5OCA9IE5BOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgOTkgPSBOQSIpLA0KICAgICAgICAgY250cnkgPSB0b19sYWJlbChjb3VudHJ5KSwNCiAgICAgICAgIHllYXIgPSBhcy5udW1lcmljKGZvcm1hdChpcjksJyVZJykpKSAlPiUNCiAgc2VsZWN0KGNudHJ5LHllYXIsYWdlLHNleCwgaW5jb21lLCBlZHVjLCB3b3JrLCBkZW10b2RheSwgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LA0KICAgICAgICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMpICU+JQ0KIyAgbXV0YXRlX2F0KHZhcnMoaW5jb21lLCBkZW10b2RheSwgZWR1YywgYWdlLA0KIyAgICAgICAgICAgICAgICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LCANCiMgICAgICAgICAgICAgICAgIHRydXN0X3BvbGljZSwgdHJ1c3RfY291cnRzKSwgDQojICAgICAgICAgICAgYXMuY2hhcmFjdGVyKSAlPiUNCiMgIG11dGF0ZV9hdCh2YXJzKGluY29tZSwgZGVtdG9kYXksIGVkdWMsIGFnZSwNCiMgICAgICAgICAgICAgICAgIHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwgDQojICAgICAgICAgICAgICAgICB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cyksIA0KIyAgICAgICAgICAgIGFzLm51bWVyaWMpICU+JQ0KICBtdXRhdGVfYXQodmFycyhpbmNvbWUsIGRlbXRvZGF5LCBlZHVjLCANCiAgICAgICAgICAgICAgICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LCANCiAgICAgICAgICAgICAgICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMpLCANCiAgICAgICAgICAgIHJhbmdlMDEpDQoNCmFzaWFuXzMNCg0KYGBgDQoNCiMjIFdhdmUgNA0KDQpgYGB7cn0NCmxvYWQobXlhbm1hcl9yYXdfdXJsKQ0KDQpuZWVkZWQgPC0gZnVuY3Rpb24gKGRhdGEpIHsNCiAgc3MgPC0gZGF0YSAlPiUNCiAgICByZW5hbWUoZWR1YyA9IHNlNSwNCiAgICAgICAgICAgdHJ1c3RfZ292ID0gcTksDQogICAgICAgICAgIHRydXN0X3BhcmxpYW1lbnQgPSBxMTEsDQogICAgICAgICAgIHRydXN0X3BvbGljZSA9IHExNCwNCiAgICAgICAgICAgdHJ1c3RfY291cnRzID0gcTgsDQogICAgICAgICAgIHNleCA9IHNlMiwNCiAgICAgICAgICAgaW5jb21lID0gc2UxM2EsDQogICAgICAgICAgIHdvcmsgPSBzZTkpICU+JQ0KICAgIG11dGF0ZV9hdCh2YXJzKGluY29tZSwgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LCANCiAgICAgICAgICAgICAgICAgICB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cywgd29yaywgc2V4KSwgDQogICAgICAgICAgICAgIGRlbGV0ZV9uYV9hc2lhbikgJT4lICAgI05BcyBkZWxldGVuIA0KICAgIG11dGF0ZSh0cnVzdF9nb3YgPSA1IC0gdHJ1c3RfZ292LA0KICAgICAgICAgICB0cnVzdF9wYXJsaWFtZW50ID0gNSAtIHRydXN0X3BhcmxpYW1lbnQsDQogICAgICAgICAgIHRydXN0X3BvbGljZSA9IDUgLSB0cnVzdF9wb2xpY2UsDQogICAgICAgICAgIHRydXN0X2NvdXJ0cyA9IDUgLSB0cnVzdF9jb3VydHMsDQogICAgICAgICAgIHNleCA9IHNleCAtIDEsICAgI3NleCAoMC8xKSBjb2RpZXJlbg0KICAgICAgICAgICBpbmNvbWUgPSBSZWNvZGUoaW5jb21lLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIjAgPSBOQSIpLA0KICAgICAgICAgICB3b3JrID0gUmVjb2RlKHdvcmssICN3b3JrICgwLzEpIGNvZGllcmVuDQogICAgICAgICAgICAgICAgICAgICAgICAgIjIgPSAwIiksDQogICAgICAgICAgIGFnZSA9IFJlY29kZShzZTNfMiwgI21pc3NpbmcgdmFsdWVzIGw/c2NoZW4NCiAgICAgICAgICAgICAgICAgICAgICAgICItMSA9IE5BIiksDQogICAgICAgICAgIGRlbXRvZGF5ID0gUmVjb2RlKHE5NCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0xID0gTkE7DQogICAgICAgICAgICAgICAgICAgICAgICAgICA5NyA9IE5BOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgOTggPSBOQTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDk5ID0gTkEiKSwNCiAgICAgICAgICAgZWR1YyA9IFJlY29kZShlZHVjLA0KICAgICAgICAgICAgICAgICAgICAgICAgICItMSA9IE5BOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgOTggPSBOQTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDk5ID0gTkEiKSwNCiAgICAgICAgICAgY250cnkgPSB0b19sYWJlbChjb3VudHJ5KSwNCiAgICAgICAgICAgeWVhciA9IHllYXIpICU+JQ0KICAgIHNlbGVjdChjbnRyeSx5ZWFyLGFnZSxzZXgsIGluY29tZSwgZWR1Yywgd29yaywgZGVtdG9kYXksIHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwNCiAgICAgICAgICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMpICU+JQ0KIyAgIG11dGF0ZV9hdCh2YXJzKGluY29tZSwgZGVtdG9kYXksIGVkdWMsIGFnZSwNCiMgICAgICAgICAgICAgICAgICB0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsIA0KIyAgICAgICAgICAgICAgICAgIHRydXN0X3BvbGljZSwgdHJ1c3RfY291cnRzKSwgDQojICAgICAgICAgICAgIGFzLmNoYXJhY3RlcikgJT4lDQojICAgbXV0YXRlX2F0KHZhcnMoaW5jb21lLCBkZW10b2RheSwgZWR1YywgYWdlLA0KIyAgICAgICAgICAgICAgICAgIHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwgDQojICAgICAgICAgICAgICAgICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMpLCANCiMgICAgICAgICAgICAgYXMubnVtZXJpYykgJT4lDQogICAgbXV0YXRlX2F0KHZhcnMoaW5jb21lLCBkZW10b2RheSwgZWR1YywgDQogICAgICAgICAgICAgICAgICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LCANCiAgICAgICAgICAgICAgICAgICB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cyksIA0KICAgICAgICAgICAgICByYW5nZTAxKQ0KICByZXR1cm4oc3MpDQp9DQpteWFubWFyIDwtIG5lZWRlZChteWFubWFyX3JhdykNCg0KbG9hZChtb25nb2xpYV9yYXdfdXJsKQ0KbG9hZChwaGlsaXBfcmF3X3VybCkNCmxvYWQodGFpd2FuX3Jhd191cmwpDQpsb2FkKHRoYWlfcmF3X3VybCkNCmxvYWQobWFsYXlfcmF3X3VybCkNCmxvYWQoc2luZ2Fwb3JlX3Jhd191cmwpDQpsb2FkKHNrX3Jhd191cmwpDQpsb2FkKGNhbWJvZGlhX3Jhd191cmwpDQoNCm1vbmdvbGlhIDwtIG5lZWRlZChtb25nb2xpYV9yYXcpDQpwaGlsaXAgPC0gbmVlZGVkKHBoaWxpcF9yYXcpDQp0YWl3YW4gPC0gbmVlZGVkKHRhaXdhbl9yYXcpDQp0aGFpIDwtIG5lZWRlZCh0aGFpX3JhdykNCm1hbGF5IDwtIG5lZWRlZChtYWxheV9yYXcpDQpzaW5nYXBvcmUgPC0gbmVlZGVkKHNpbmdhcG9yZV9yYXcpICNTaW5nYXBvcmUgaGF0IGV4dHJlbSB2aWVsZSBNaXNzaW5nIHZhbHVlcw0Kc2sgPC0gbmVlZGVkKHNrX3JhdykNCmNhbWJvZGlhIDwtIG5lZWRlZChjYW1ib2RpYV9yYXcpDQoNCmFzaWFuPC0gcmJpbmQoYXNpYW5fMyxteWFubWFyLGNhbWJvZGlhLHNrLHNpbmdhcG9yZSxtYWxheSx0aGFpLHRhaXdhbixwaGlsaXAsDQogICAgICAgICAgICAgICBjYW1ib2RpYSxtb25nb2xpYSkgJT4lIGFzLnRibCgpDQoNCmFzaWFuDQoNCmBgYA0KDQoNCiMgRXVyb3BlYW4gU29jaWFsIFN1cnZleQ0KDQpgYGB7cn0NCmxvYWQoRVNTX3Jhd191cmwpDQoNCkVTUyA8LUVTU19yYXcgJT4lIA0KICByZW5hbWUoZGVtdG9kYXkgPSBkbWNudG92LA0KICAgICAgICAgYWdlID0gYWdlYSwNCiAgICAgICAgIHllYXIgPSBpbnd5eXMsDQogICAgICAgICB0cnVzdF9nb3YgPSB0cnN0cGx0LA0KICAgICAgICAgdHJ1c3RfcGFybGlhbWVudCA9IHRyc3RwcmwsDQogICAgICAgICB0cnVzdF9wb2xpY2UgPSB0cnN0cGxjLA0KICAgICAgICAgdHJ1c3RfY291cnRzID0gdHJzdGxnbCkgJT4lDQogIG11dGF0ZShpbmNvbWUgPSA1IC0gaGluY2ZlbCwNCiAgICAgICAgIGVkdWMgPSBSZWNvZGUoZWlzY2VkLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAiNTUgPSBOQSIpLA0KICAgICAgICAgd29yayA9IGlmZWxzZShtbmFjdGljID09IDEsIDEsIDApLA0KICAgICAgICAgc2V4ID0gZ25kciAtIDEsICNzZXggdmFyaWFibGUgZXJzdGVsbGVuDQogICAgICAgICBjbnRyeSA9IHRvX2xhYmVsKGNudHJ5KSkgJT4lDQogIHNlbGVjdChjbnRyeSx5ZWFyLGFnZSxzZXgsIGluY29tZSwgZWR1Yywgd29yaywgZGVtdG9kYXksIHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwNCiAgICAgICAgIHRydXN0X3BvbGljZSwgdHJ1c3RfY291cnRzKSAlPiUNCiMgIG11dGF0ZV9hdCh2YXJzKGluY29tZSwgZGVtdG9kYXksIGVkdWMsIA0KIyAgICAgICAgICAgICAgICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LCANCiMgICAgICAgICAgICAgICAgIHRydXN0X3BvbGljZSwgdHJ1c3RfY291cnRzKSwgDQojICAgICAgICAgICAgYXMuY2hhcmFjdGVyKSAlPiUNCiMgIG11dGF0ZV9hdCh2YXJzKGluY29tZSwgZGVtdG9kYXksIGVkdWMsIA0KIyAgICAgICAgICAgICAgICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LCANCiMgICAgICAgICAgICAgICAgIHRydXN0X3BvbGljZSwgdHJ1c3RfY291cnRzKSwgDQojICAgICAgICAgICAgYXMubnVtZXJpYykgJT4lDQogIG11dGF0ZV9hdCh2YXJzKGluY29tZSwgZGVtdG9kYXksIGVkdWMsIA0KICAgICAgICAgICAgICAgICB0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsIA0KICAgICAgICAgICAgICAgICB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cyksIA0KICAgICAgICAgICAgc3RkeikgJT4lDQogIG11dGF0ZV9hdCh2YXJzKGluY29tZSwgZGVtdG9kYXksIGVkdWMsIA0KICAgICAgICAgICAgICAgICB0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsIA0KICAgICAgICAgICAgICAgICB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cyksIA0KICAgICAgICAgICAgcmFuZ2UwMSkNCg0KDQpFU1MNCmBgYA0KDQoNCiMgTWVyZ2luZyBFdmVyeXRoaW5nDQoNCmBgYHtyfQ0KRVNTJHN1cnZleSA8LSByZXAoIkVTUyIsbnJvdyhFU1MpKQ0KYXNpYW4kc3VydmV5IDwtIHJlcCgiYXNpYW4iLG5yb3coYXNpYW4pKQ0KYW1lcmljYXMkc3VydmV5IDwtIHJlcCgiYW1lcmljYXMiLG5yb3coYW1lcmljYXMpKQ0Kd3ZzJHN1cnZleSA8LSByZXAoInd2cyIsbnJvdyh3dnMpKQ0KbGF0aW5vJHN1cnZleSA8LSByZXAoImxhdGlubyIsbnJvdyhsYXRpbm8pKQ0KYWZybyRzdXJ2ZXkgPC0gcmVwKCJhZnJvIixucm93KGFmcm8pKQ0KDQoNCmFtZXJpY2FzJGNudHJ5IDwtIGFzLmNoYXJhY3RlcihhbWVyaWNhcyRjbnRyeSkNCmFtZXJpY2FzJGNudHJ5W2FtZXJpY2FzJGNudHJ5PT0iSGFpdD8iXSA8LSAiSGFpdGkiDQoNCg0KYW1lcmljYXMkY250cnk8LWNvdW50cnljb2RlKGFtZXJpY2FzJGNudHJ5LCJjb3VudHJ5Lm5hbWUuZW4iLCJjb3VudHJ5Lm5hbWUuZW4iKQ0Kd3ZzJGNudHJ5PC1jb3VudHJ5Y29kZSh3dnMkY250cnksImNvdW50cnkubmFtZS5lbiIsImNvdW50cnkubmFtZS5lbiIpDQpsYXRpbm8kY250cnk8LWNvdW50cnljb2RlKGxhdGlubyRjbnRyeSwiY291bnRyeS5uYW1lLmVuIiwiY291bnRyeS5uYW1lLmVuIikNCmFmcm8kY250cnk8LWNvdW50cnljb2RlKGFmcm8kY250cnksImNvdW50cnkubmFtZS5lbiIsImNvdW50cnkubmFtZS5lbiIpDQphc2lhbiRjbnRyeTwtY291bnRyeWNvZGUoYXNpYW4kY250cnksImNvdW50cnkubmFtZS5lbiIsImNvdW50cnkubmFtZS5lbiIpDQpFU1MkY250cnk8LWNvdW50cnljb2RlKEVTUyRjbnRyeSwiY291bnRyeS5uYW1lLmVuIiwiY291bnRyeS5uYW1lLmVuIikNCg0KdW5pcXVlKEVTUyRjbnRyeSkNCnVuaXF1ZShhc2lhbiRjbnRyeSkNCnVuaXF1ZSh3dnMkY250cnkpDQp1bmlxdWUobGF0aW5vJGNudHJ5KQ0KdW5pcXVlKGFtZXJpY2FzJGNudHJ5KQ0KdW5pcXVlKGFmcm8kY250cnkpDQoNCnd2cyA8LSB3dnMgJT4lIGRwbHlyOjpzZWxlY3QoY250cnkseWVhcixhZ2Usc2V4LCBpbmNvbWUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZHVjLCB3b3JrLCBkZW10b2RheSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMsc3VydmV5KQ0KDQpsYXRpbm8gPC0gbGF0aW5vICU+JSBkcGx5cjo6c2VsZWN0KGNudHJ5LHllYXIsYWdlLHNleCwgaW5jb21lLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWR1Yywgd29yaywgZGVtdG9kYXksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydXN0X3BvbGljZSwgdHJ1c3RfY291cnRzLHN1cnZleSkNCg0KDQphZnJvIDwtIGFmcm8gJT4lIGRwbHlyOjpzZWxlY3QoY250cnkseWVhcixhZ2Usc2V4LCBpbmNvbWUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkdWMsIHdvcmssIGRlbXRvZGF5LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMsc3VydmV5KQ0KDQoNCmFtZXJpY2FzIDwtIGFtZXJpY2FzICU+JSBkcGx5cjo6c2VsZWN0KGNudHJ5LHllYXIsYWdlLHNleCwgaW5jb21lLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkdWMsIHdvcmssIGRlbXRvZGF5LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydXN0X3BvbGljZSwgdHJ1c3RfY291cnRzLHN1cnZleSkNCg0KYXNpYW4gPC0gYXNpYW4gJT4lIGRwbHlyOjpzZWxlY3QoY250cnkseWVhcixhZ2Usc2V4LCBpbmNvbWUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWR1Yywgd29yaywgZGVtdG9kYXksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMsc3VydmV5KQ0KDQpFU1MgPC0gRVNTICU+JSBkcGx5cjo6c2VsZWN0KGNudHJ5LHllYXIsYWdlLHNleCwgaW5jb21lLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWR1Yywgd29yaywgZGVtdG9kYXksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydXN0X3BvbGljZSwgdHJ1c3RfY291cnRzLHN1cnZleSkNCg0KDQptZXJnZWQgPC0gcmJpbmQod3ZzLGxhdGlubyxhZnJvLGFtZXJpY2FzLGFzaWFuLEVTUykNCg0KbWVyZ2VkIDwtIG1lcmdlZCAlPiUNCiAgI2NyZWF0ZSBkdW1taWVzDQogIG11dGF0ZSh3dnMgICAgID0gaWZlbHNlKHN1cnZleT09Ind2cyIsMSwgMCksDQogICAgICAgIGFmcm8gICAgID0gaWZlbHNlKHN1cnZleT09ImFmcm8iLDEsIDApLA0KICAgICAgICBsYXRpbm8gICA9IGlmZWxzZShzdXJ2ZXk9PSJsYXRpbm8iLDEsIDApLA0KICAgICAgICBhbWVyaWNhcyA9IGlmZWxzZShzdXJ2ZXk9PSJhbWVyaWNhcyIsMSwgMCksDQogICAgICAgIGFzaWFuICAgID0gaWZlbHNlKHN1cnZleT09ImFzaWFuIiwxLCAwKSwNCiAgICAgICAgRVNTICAgICAgPSBpZmVsc2Uoc3VydmV5PT0iRVNTIiwxLCAwKQ0KICAgICAgICApICU+JQ0KICAjZmlsdGVyIGJhZCBjb3VudHJpZXMNCiAgZmlsdGVyKGNudHJ5IT0iRWd5cHQiKSAlPiUgI2V4Y2x1ZGUgRWd5cHQgMjAxMw0KICBmaWx0ZXIoY250cnkhPSJMaWJ5YSIpICU+JSAjZXhjbHVkZSBMaWJ5YSAyMDE0DQogIGZpbHRlcihjbnRyeSE9Ik1hbGkiKSAlPiUgI2V4Y2x1ZGUgTWFsaSAyMDEyDQogIGZpbHRlcihjbnRyeSE9IlllbWVuIikgJT4lICNleGNsdWRlIFllbWVuIDIwMTINCiAgZmlsdGVyKGNudHJ5IT0iUGFsZXN0aW5lLCBTdGF0ZSBvZiIpICNleGNsdWRlIFBhbGVzdGluZSAyMDEzDQoNCiAgICAjIGFkZGluZyB3ZWlnaHQNCm1lcmdlZCA8LSBtZXJnZWQgJT4lDQogIGdyb3VwX2J5KGNudHJ5KSAlPiUNCiAgdGFsbHkoKSAlPiUNCiAgbXV0YXRlKHdlaWdodCA9IDEwMDAvbikgJT4lDQogIHNlbGVjdChjbnRyeSwgd2VpZ2h0KSAlPiUNCiAgbGVmdF9qb2luKG1lcmdlZCwgImNudHJ5IikNCiMgc2VsZWN0KGNudHJ5LCB5ZWFyKSAlPiUNCiMgdW5pcXVlICU+JQ0KIyBWaWV3DQoNCm1lcmdlZA0KDQp0YWJsZShtZXJnZWQkd3ZzKQ0KdGFibGUobWVyZ2VkJGFmcm8pDQp0YWJsZShtZXJnZWQkbGF0aW5vKQ0KdGFibGUobWVyZ2VkJGFtZXJpY2FzKQ0KdGFibGUobWVyZ2VkJGFzaWFuKQ0KdGFibGUobWVyZ2VkJEVTUykNCmBgYA0KDQoNCg0KIyMgU0VNIEluZGV4DQoNCmBgYHtyfQ0KbWVyZ2VkMiA8LSBtZXJnZWQgJT4lDQogIG11dGF0ZShnb3ZfdHJ1c3QgPSB0cnVzdF9nb3YgKyB0cnVzdF9wYXJsaWFtZW50ICsgDQogICAgICAgICAgIHRydXN0X3BvbGljZSArIHRydXN0X2NvdXJ0cykgJT4lDQogIGZpbHRlcighaXMubmEoZ292X3RydXN0KSkNCg0KbWVyZ2VkMyA8LSBtZXJnZWQgJT4lDQogIG11dGF0ZShnb3ZfdHJ1c3QgPSB0cnVzdF9nb3YgKyB0cnVzdF9wYXJsaWFtZW50ICsgDQogICAgICAgICAgIHRydXN0X3BvbGljZSArIHRydXN0X2NvdXJ0cykgJT4lDQogIGZpbHRlcihpcy5uYShnb3ZfdHJ1c3QpKQ0KDQpzdnkuZGYgPC0gc3VydmV5OjpzdnlkZXNpZ24oaWQ9IH4xLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0cz0gfndlaWdodCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE9IG1lcmdlZCkgDQoNCm1vZGVsIDwtICcjIG1lYXN1cmVtZW50IG1vZGVsIDENCmdvdl90cnVzdDIgPX4gMSp0cnVzdF9nb3YgKyB0cnVzdF9wYXJsaWFtZW50ICsgDQp0cnVzdF9wb2xpY2UgKyB0cnVzdF9jb3VydHMNCnRydXN0X2dvdiB+fiB0cnVzdF9wYXJsaWFtZW50DQonDQoNCm1lcmdlZCA8LSBtZXJnZWQgJT4lDQogIG11dGF0ZV9hdCh2YXJzKHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwNCiAgICAgICAgICAgICAgICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMpLCBhcy5udW1lcmljKQ0KDQojIGNvcihuYS5vbWl0KGRhdGEuZnJhbWUobWVyZ2VkJHRydXN0X2dvdiwNCiMgICAgICAgICAgICAgICBtZXJnZWQkdHJ1c3RfcG9saWNlLA0KIyAgICAgICAgICAgICAgIG1lcmdlZCR0cnVzdF9jb3VydHMsDQojICAgICAgICAgICAgICAgbWVyZ2VkJHRydXN0X3BhcmxpYW1lbnQsDQojICAgICAgICAgICAgICAgbWVyZ2VkJGRlbXRvZGF5KSkpDQoNCmxhdmFhbl9tb2RlbDE8LWNmYShtb2RlbCwgbWVhbnN0cnVjdHVyZSA9IFQsIA0KICAgICAgICAgICAgICAgICAgIGRhdGEgPSBhcy5kYXRhLmZyYW1lKG1lcmdlZCksDQogICAgICAgICAgICAgICAgICAgZXN0aW1hdG9yPSAiTUxNIikNCg0KZml0X2ExPC1sYXZhYW4uc3VydmV5KGxhdmFhbl9tb2RlbDEsIA0KICAgICAgICAgICAgZXN0aW1hdG9yPSAiTUxNIiwgc3VydmV5LmRlc2lnbj1zdnkuZGYpDQpzdW1tYXJ5KGZpdF9hMSwgc3RhbmRhcmRpemVkPVRSVUUsZml0Lm1lYXN1cmVzID0gVFJVRSwgcnNxID0gVCkNCg0KbWVyZ2VkNDwtY2JpbmQobWVyZ2VkMiwgcHJlZGljdChmaXRfYTEsIG5ld2RhdGEgPSBtZXJnZWQyKSkNCm1lcmdlZDQkZ292X3RydXN0MjwtcmFuZ2UwMShtZXJnZWQ0JGdvdl90cnVzdDIpDQoNCiMgaGVhZChtZXJnZWQ0KQ0KDQptZXJnZWQ8LXBseXI6OnJiaW5kLmZpbGwobWVyZ2VkMyxtZXJnZWQ0KQ0KbWVyZ2VkJGdvdl90cnVzdDwtbWVyZ2VkJGdvdl90cnVzdDINCmhlYWQobWVyZ2VkKQ0KYGBgDQoNCg0KIyMgU29tZSBSZWNvZGluZw0KDQpgYGB7cn0NCnRhYmxlKG1lcmdlZCRjbnRyeSxtZXJnZWQkeWVhcikNCg0KdGFibGUoc3Vic2V0KG1lcmdlZCxtZXJnZWQkY250cnk9PSJDaGluYSIpJHN1cnZleSwNCiAgICAgIHN1YnNldChtZXJnZWQsbWVyZ2VkJGNudHJ5PT0iQ2hpbmEiKSR5ZWFyKQ0KDQptZXJnZWQkeWVhclttZXJnZWQkY250cnk9PSJDaGluYSIgJiBtZXJnZWQkeWVhciA9PSAxNTgzXSA8LSAyMDExDQptZXJnZWQkeWVhclttZXJnZWQkY250cnk9PSJDaGluYSIgJiBtZXJnZWQkeWVhciA9PSAyMDAwXSA8LSAyMDExDQptZXJnZWQkeWVhclttZXJnZWQkY250cnk9PSJDaGluYSIgJiBtZXJnZWQkeWVhciA9PSAyMDc3XSA8LSAyMDExDQptZXJnZWQkeWVhclttZXJnZWQkY250cnk9PSJDaGluYSIgJiBtZXJnZWQkeWVhciA9PSAyMDEyXSA8LSAyMDExDQoNCnRhYmxlKHN1YnNldChtZXJnZWQsbWVyZ2VkJGNudHJ5PT0iU2luZ2Fwb3JlIikkc3VydmV5LA0KICAgICAgc3Vic2V0KG1lcmdlZCxtZXJnZWQkY250cnk9PSJTaW5nYXBvcmUiKSR5ZWFyKQ0KDQptZXJnZWQkeWVhclttZXJnZWQkY250cnk9PSJTaW5nYXBvcmUiICYgbWVyZ2VkJHllYXIgPT0gMTU4Ml0gPC0gMjAxMQ0KDQpoaXN0KG1lcmdlZCRnb3ZfdHJ1c3QpDQpgYGANCg0KDQoNCg0KIyBMZXZlbCAyIERhdGENCg0KIyMgVi1EZW0NCg0KYGBge3J9DQpsb2FkKHZkZW1zX3N0YXJ0X3VybCkNCg0KdmRlbXNfc3ViIDwtIHZkZW1zX3N0YXJ0ICU+JSBmaWx0ZXIoeWVhciAlaW4lIDIwMDA6MjAxMCkNCg0KI3RpYmJsZShpZCA9IDE6MTg5NikNCiN0YWJsZSh2ZGVtc19zdWIkY291bnRyeV9uYW1lKQ0KDQp2ZGVtIDwtIHZkZW1zX3N0YXJ0ICU+JQ0KICBmaWx0ZXIoeWVhciAlaW4lIDIwMDA6MjAxMCkgJT4lIA0KICBncm91cF9ieShjb3VudHJ5X25hbWUpICU+JQ0KICB0YWxseSAlPiUNCiAgbXV0YXRlKGNudHJ5ID0gdW5pcXVlKGNvdW50cnlfbmFtZSkpICU+JQ0KICAjRENJIFZhcmlhYmxlcw0KICBtdXRhdGUoZGVsaWIxMCA9IHZkZW1zX3N1YiAlPiUNCiAgICAgICAgICAgZGNhc3QoY291bnRyeV9uYW1lIH4geWVhciwgDQogICAgICAgICAgICAgICAgIHZhbHVlLnZhcj1jKCJ2MnhkbF9kZWxpYiIpKSAlPiUNCiAgICAgICAgICAgc2VsZWN0KGAyMDAwYDpgMjAxMGApICU+JQ0KICAgICAgICAgICByb3dNZWFucykgJT4lDQogIG11dGF0ZShjb25zdWx0MTAgPSB2ZGVtc19zdWIgJT4lIA0KICAgICAgICAgICBkY2FzdChjb3VudHJ5X25hbWUgfiB5ZWFyLCANCiAgICAgICAgICAgICAgICAgdmFsdWUudmFyPWMoInYyZGxjb25zbHQiKSkgJT4lDQogICAgICAgICAgIHNlbGVjdChgMjAwMGA6YDIwMTBgKSAlPiUNCiAgICAgICAgICAgcm93TWVhbnMpICU+JQ0KICBtdXRhdGUocmVhc29uMTAgPSB2ZGVtc19zdWIgJT4lIA0KICAgICAgICAgICBkY2FzdChjb3VudHJ5X25hbWUgfiB5ZWFyLCANCiAgICAgICAgICAgICAgICAgdmFsdWUudmFyPWMoInYyZGxyZWFzb24iKSkgJT4lDQogICAgICAgICAgIHNlbGVjdChgMjAwMGA6YDIwMTBgKSAlPiUNCiAgICAgICAgICAgcm93TWVhbnMpICU+JQ0KICBtdXRhdGUoY29tbW9uMTAgPSB2ZGVtc19zdWIgJT4lIA0KICAgICAgICAgICBkY2FzdChjb3VudHJ5X25hbWUgfiB5ZWFyLCANCiAgICAgICAgICAgICAgICAgdmFsdWUudmFyPWMoInYyZGxjb21tb24iKSkgJT4lDQogICAgICAgICAgIHNlbGVjdChgMjAwMGA6YDIwMTBgKSAlPiUNCiAgICAgICAgICAgcm93TWVhbnMpICU+JQ0KICBtdXRhdGUoY291bnRyMTAgPSB2ZGVtc19zdWIgJT4lIA0KICAgICAgICAgICBkY2FzdChjb3VudHJ5X25hbWUgfiB5ZWFyLCANCiAgICAgICAgICAgICAgICAgdmFsdWUudmFyPWMoInYyZGxjb3VudHIiKSkgJT4lDQogICAgICAgICAgIHNlbGVjdChgMjAwMGA6YDIwMTBgKSAlPiUNCiAgICAgICAgICAgcm93TWVhbnMpICU+JQ0KICBtdXRhdGUoZW5nYWdlMTAgPSB2ZGVtc19zdWIgJT4lIA0KICAgICAgICAgICBkY2FzdChjb3VudHJ5X25hbWUgfiB5ZWFyLCANCiAgICAgICAgICAgICAgICAgdmFsdWUudmFyPWMoInYyZGxlbmdhZ2UiKSkgJT4lDQogICAgICAgICAgIHNlbGVjdChgMjAwMGA6YDIwMTBgKSAlPiUNCiAgICAgICAgICAgcm93TWVhbnMpICU+JQ0KICBtdXRhdGUoZGVsaWJkZW0xMCA9IHZkZW1zX3N1YiAlPiUgDQogICAgICAgICAgIGRjYXN0KGNvdW50cnlfbmFtZSB+IHllYXIsIA0KICAgICAgICAgICAgICAgICB2YWx1ZS52YXI9YygidjJ4X2RlbGliZGVtIikpICU+JQ0KICAgICAgICAgICBzZWxlY3QoYDIwMDBgOmAyMDEwYCkgJT4lDQogICAgICAgICAgIHJvd01lYW5zKSAlPiUNCiAgIyBDb250cm9sIFZhcmlhYmxlcw0KICBtdXRhdGUocG9saXR5MTAgPSB2ZGVtc19zdWIgJT4lIA0KICAgICAgICAgICBkY2FzdChjb3VudHJ5X25hbWUgfiB5ZWFyLCANCiAgICAgICAgICAgICAgICAgdmFsdWUudmFyPWMoImVfZmhfaXBvbGl0eTIiKSkgJT4lDQogICAgICAgICAgIHNlbGVjdChgMjAwMGA6YDIwMTBgKSAlPiUNCiAgICAgICAgICAgcm93TWVhbnMpICU+JQ0KICBtdXRhdGUoZ2RwMTAgPSB2ZGVtc19zdWIgJT4lIA0KICAgICAgICAgICBkY2FzdChjb3VudHJ5X25hbWUgfiB5ZWFyLCANCiAgICAgICAgICAgICAgICAgdmFsdWUudmFyPWMoImVfR0RQX1Blcl9DYXBfSGFiZXJfTWVuXzIiKSkgJT4lDQogICAgICAgICAgIHNlbGVjdChgMjAwMGA6YDIwMTBgKSAlPiUNCiAgICAgICAgICAgcm93TWVhbnMpICU+JQ0KICBtdXRhdGUocml3MTAgPSB2ZGVtc19zdWIgJT4lIA0KICAgICAgICAgICBkY2FzdChjb3VudHJ5X25hbWUgfiB5ZWFyLCANCiAgICAgICAgICAgICAgICAgdmFsdWUudmFyPWMoImVfdjJ4X3JlZ2ltZV9jaSIpKSAlPiUNCiAgICAgICAgICAgc2VsZWN0KGAyMDAwYDpgMjAxMGApICU+JQ0KICAgICAgICAgICByb3dNZWFucykgJT4lDQogIG11dGF0ZShjb3JlY2l2aWwxMCA9IHZkZW1zX3N1YiAlPiUgDQogICAgICAgICAgIGRjYXN0KGNvdW50cnlfbmFtZSB+IHllYXIsIA0KICAgICAgICAgICAgICAgICB2YWx1ZS52YXI9YygidjJ4Y3NfY2NzaSIpKSAlPiUNCiAgICAgICAgICAgc2VsZWN0KGAyMDAwYDpgMjAxMGApICU+JQ0KICAgICAgICAgICByb3dNZWFucykgJT4lDQogIG11dGF0ZShwb3AxMCA9IHZkZW1zX3N1YiAlPiUgDQogICAgICAgICAgIGRjYXN0KGNvdW50cnlfbmFtZSB+IHllYXIsIA0KICAgICAgICAgICAgICAgICB2YWx1ZS52YXI9YygiZV9taXBvcHVsYSIpKSAlPiUNCiAgICAgICAgICAgc2VsZWN0KGAyMDAwYDpgMjAxMGApICU+JQ0KICAgICAgICAgICByb3dNZWFucykgJT4lDQogIG11dGF0ZShjb3JydXB0aW9uMTAgPSB2ZGVtc19zdWIgJT4lIA0KICAgICAgICAgICBkY2FzdChjb3VudHJ5X25hbWUgfiB5ZWFyLCANCiAgICAgICAgICAgICAgICAgdmFsdWUudmFyPWMoInYyeF9jb3JyIikpICU+JQ0KICAgICAgICAgICBzZWxlY3QoYDIwMDBgOmAyMDEwYCkgJT4lDQogICAgICAgICAgIHJvd01lYW5zKSAlPiUNCiAgbXV0YXRlKHBvbGtpbGwxMCA9IHZkZW1zX3N1YiAlPiUgDQogICAgICAgICAgIGRjYXN0KGNvdW50cnlfbmFtZSB+IHllYXIsIA0KICAgICAgICAgICAgICAgICB2YWx1ZS52YXI9YygidjJ4X2NscGh5IikpICU+JQ0KICAgICAgICAgICBzZWxlY3QoYDIwMDBgOmAyMDEwYCkgJT4lDQogICAgICAgICAgIHJvd01lYW5zKSAlPiUNCiAgbXV0YXRlKGVkdWMxMCA9IHZkZW1zX3N1YiAlPiUgDQogICAgICAgICAgIGRjYXN0KGNvdW50cnlfbmFtZSB+IHllYXIsIA0KICAgICAgICAgICAgICAgICB2YWx1ZS52YXI9YygiZV9wZWF2ZWR1YyIpKSAlPiUNCiAgICAgICAgICAgc2VsZWN0KGAyMDAwYDpgMjAxMGApICU+JQ0KICAgICAgICAgICByb3dNZWFucykgJT4lDQogIG11dGF0ZShnaW5pMTAgPSB2ZGVtc19zdWIgJT4lIA0KICAgICAgICAgICBkY2FzdChjb3VudHJ5X25hbWUgfiB5ZWFyLCANCiAgICAgICAgICAgICAgICAgdmFsdWUudmFyPWMoImVfcGVnaW5pd2kiKSkgJT4lDQogICAgICAgICAgIHNlbGVjdChgMjAwMGA6YDIwMTBgKSAlPiUNCiAgICAgICAgICAgcm93TWVhbnMpICU+JSANCiAgIyBEdW1teSB2YXJpYWJsZXMNCiAgbXV0YXRlKHBvbF9yb3VuZCA9IHJvdW5kKHBvbGl0eTEwICogMiAtMTApKSAlPiUgDQogIG11dGF0ZShwb2xpdHlfZGVtZHVtbXkgPSBpZmVsc2UocG9sX3JvdW5kID4gNSwgMSwgMCkpICU+JSANCiAgbXV0YXRlKHBvbGl0eV9hbm9kdW1teSA9IGlmZWxzZShwb2xfcm91bmQgPj0gLTUgJiBwb2xfcm91bmQgPD0gNSwgMSwgMCkpICU+JSANCiAgbXV0YXRlKHBvbGl0eV9hdXRvZHVtbXkgPSBpZmVsc2UocG9sX3JvdW5kIDwgLTUsIDEsIDApKSAlPiUgDQogIG11dGF0ZShyZWdpbWUgPSBjYXNlX3doZW4oDQogICAgcG9saXR5X2F1dG9kdW1teSA9PSAxIH4gImF1dG8iLA0KICAgIHBvbGl0eV9hbm9kdW1teSA9PSAxIH4gImFubyIsDQogICAgcG9saXR5X2RlbWR1bW15ID09IDEgfiAiZGVtbyINCiAgICApDQogICkgJT4lDQogIG11dGF0ZShyZWdpbWUgPSBmYWN0b3IocmVnaW1lLCBsZXZlbHMgPSBjKCJkZW1vIiwgImFubyIsICJhdXRvIikpKSAlPiUgDQogIG11dGF0ZShjbnRyeSA9IGNvdW50cnljb2RlKGNudHJ5LCJjb3VudHJ5Lm5hbWUuZW4iLCJjb3VudHJ5Lm5hbWUuZW4iKSkNCg0KdmRlbSRjbnRyeVs0MF0gPC0gIlZpZXQgTmFtIg0KDQoNCiMgaWZlbHNlKHJvdW5kKHZkZW0kcG9saXR5MTAgKiAyIC0xMCkgPj0gLTUgJiByb3VuZCh2ZGVtJHBvbGl0eTEwICogMiAtMTApIDw9IDUsIDEsIDApDQoNCnRhYmxlKHZkZW0kcmVnaW1lKQ0KcHJpbnQobGV2ZWxzKHZkZW0kcmVnaW1lKSkgDQoNCg0KDQogIA0KYGBgDQoNCiMjIyBUbyBEbw0KDQpgYGB7cn0NCiAgbXV0YXRlKHJlZ2lvbnMgPSB2ZGVtc19zdWIgJT4lIA0KICAgICAgICAgICBkY2FzdChjb3VudHJ5X25hbWUgfiB5ZWFyLCANCiAgICAgICAgICAgICAgICAgdmFsdWUudmFyPWMoImVfcmVnaW9ucG9sIikpICU+JQ0KICAgICAgICAgICBzZWxlY3QoJzIwMDAnKSAlPiUgDQogICAgICAgICAgIG11dGF0ZShyZWdpb25zID0gZmN0X3JlY29kZShhcy5mYWN0b3IoYDIwMDBgKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkUuIEV1cm9wZSBhbmQgQy4gQXNpYSAocG9zdC1Db21tdW5pc3QpIiA9ICIxIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxhdGluIEFtZXJpY2EgJiBDYXJyaWJlYW4iID0gIjIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTUVOQSIgPSAiMyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdWItU2FoYXJhbiBBZnJpY2EiID0gIjQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVy4gRXVyb3BlIGFuZCBOLiBBbWVyaWNhIiA9ICI1IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNvdXRoICYgRWFzdCBBc2lhICYgUGFjaWZpYyIgPSAiNiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTb3V0aCAmIEVhc3QgQXNpYSAmIFBhY2lmaWMiID0gIjciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU291dGggJiBFYXN0IEFzaWEgJiBQYWNpZmljIiA9ICI4IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNvdXRoICYgRWFzdCBBc2lhICYgUGFjaWZpYyIgPSAiOSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMYXRpbiBBbWVyaWNhICYgQ2FycmliZWFuIiA9ICIxMCIpICAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNfZmFjdG9yKSkgICU+JQ0KICAgICAgICAgICBzZWxlY3QocmVnaW9ucykNCg0KDQp0YWJsZShyZWdpb25zKQ0KDQpyZWdpb25zMiA8LSB2ZGVtc19zdWIgJT4lIA0KICBkY2FzdChjb3VudHJ5X25hbWUgfiB5ZWFyLCANCiAgICAgICAgdmFsdWUudmFyPWMoImVfcmVnaW9ucG9sIikpICU+JQ0KICBzZWxlY3QoJzIwMDAnKSAlPiUgDQogIHRyYW5zbXV0ZShmY3RfcmVjb2RlKGFzLmZhY3RvcihgMjAwMGApLA0KICAgICAgICAgICAgICAgICAgICAgICAiRS4gRXVyb3BlIGFuZCBDLiBBc2lhIChwb3N0LUNvbW11bmlzdCkiID0gIjEiLA0KICAgICAgICAgICAgICAgICAgICAgICAiTGF0aW4gQW1lcmljYSAmIENhcnJpYmVhbiIgPSAiMiIsDQogICAgICAgICAgICAgICAgICAgICAgICJNRU5BIiA9ICIzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIlN1Yi1TYWhhcmFuIEFmcmljYSIgPSAiNCIsDQogICAgICAgICAgICAgICAgICAgICAgICJXLiBFdXJvcGUgYW5kIE4uIEFtZXJpY2EiID0gIjUiLA0KICAgICAgICAgICAgICAgICAgICAgICAiRWFzdCBBc2lhIiA9ICI2IiwNCiAgICAgICAgICAgICAgICAgICAgICAgIlNvdXRoLUVhc3QgQXNpYSIgPSAiNyIsDQogICAgICAgICAgICAgICAgICAgICAgICJTb3V0aCBBc2lhIiA9ICI4IiwNCiAgICAgICAgICAgICAgICAgICAgICAgIlBhY2lmaWMiID0gIjkiLA0KICAgICAgICAgICAgICAgICAgICAgICAiTGF0aW4gQW1lcmljYSAmIENhcnJpYmVhbiIgPSAiMTAiKSkNCg0KdGFibGUocmVnaW9uczIpDQoNCnJlZ2lvbnMzIDwtIGRjYXN0KHZkZW1zX3N1YiwgY291bnRyeV9uYW1lIH4geWVhciwgdmFsdWUudmFyPWMoImVfcmVnaW9ucG9sIikpJCIyMDAwIg0KDQpwb3N0Y29tICAgPC0gYXMubnVtZXJpYyhyZWdpb25zMyA9PSAxKQ0KbGF0aW4gICAgIDwtIGFzLm51bWVyaWMocmVnaW9uczMgPT0gMiB8IHJlZ2lvbnMzID09IDEwKQ0KbWVuYSAgICAgIDwtIGFzLm51bWVyaWMocmVnaW9uczMgPT0gMykNCnN1YnNhaGFyYSA8LSBhcy5udW1lcmljKHJlZ2lvbnMzID09IDQpDQp3ZXN0ICAgICAgPC0gYXMubnVtZXJpYyhyZWdpb25zMyA9PSA1KQ0KZS5hc2lhICAgIDwtIGFzLm51bWVyaWMocmVnaW9uczMgPT0gNikNCnMuZS5hc2lhICA8LSBhcy5udW1lcmljKHJlZ2lvbnMzID09IDcpDQpzLmFzaWEgICAgPC0gYXMubnVtZXJpYyhyZWdpb25zMyA9PSA4KQ0KcGFjaWZpYyAgIDwtIGFzLm51bWVyaWMocmVnaW9uczMgPT0gOSkNCg0KDQp3dyA8LSB2ZGVtc19zdWIgJT4lIA0KICBkY2FzdChjb3VudHJ5X25hbWUgfiB5ZWFyLCANCiAgICAgICAgICAgICAgICAgdmFsdWUudmFyPWMoImVfcmVnaW9ucG9sIikpICU+JQ0KICBzZWxlY3QoJzIwMDAnKSAlPiUgDQogIG11dGF0ZShyZWdpb25zID0gZmN0X3JlY29kZShhcy5mYWN0b3IoYDIwMDBgKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkUuIEV1cm9wZSBhbmQgQy4gQXNpYSAocG9zdC1Db21tdW5pc3QpIiA9ICIxIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxhdGluIEFtZXJpY2EgJiBDYXJyaWJlYW4iID0gIjIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTUVOQSIgPSAiMyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdWItU2FoYXJhbiBBZnJpY2EiID0gIjQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVy4gRXVyb3BlIGFuZCBOLiBBbWVyaWNhIiA9ICI1IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNvdXRoICYgRWFzdCBBc2lhICYgUGFjaWZpYyIgPSAiNiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTb3V0aCAmIEVhc3QgQXNpYSAmIFBhY2lmaWMiID0gIjciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU291dGggJiBFYXN0IEFzaWEgJiBQYWNpZmljIiA9ICI4IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNvdXRoICYgRWFzdCBBc2lhICYgUGFjaWZpYyIgPSAiOSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMYXRpbiBBbWVyaWNhICYgQ2FycmliZWFuIiA9ICIxMCIpKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzX2ZhY3RvcigpICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KHJlZ2lvbnMpDQoNCnd3DQoNCnJlZ2lvbnMyIDwtIHZkZW1zX3N1YiAlPiUgDQogIGRjYXN0KGNvdW50cnlfbmFtZSB+IHllYXIsIA0KICAgICAgICB2YWx1ZS52YXI9YygiZV9yZWdpb25wb2wiKSkgJT4lDQogIHNlbGVjdCgnMjAwMCcpICU+JSANCiAgdHJhbnNtdXRlKGZjdF9yZWNvZGUoYXMuZmFjdG9yKGAyMDAwYCksDQogICAgICAgICAgICAgICAgICAgICAgICJFLiBFdXJvcGUgYW5kIEMuIEFzaWEgKHBvc3QtQ29tbXVuaXN0KSIgPSAiMSIsDQogICAgICAgICAgICAgICAgICAgICAgICJMYXRpbiBBbWVyaWNhICYgQ2FycmliZWFuIiA9ICIyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIk1FTkEiID0gIjMiLA0KICAgICAgICAgICAgICAgICAgICAgICAiU3ViLVNhaGFyYW4gQWZyaWNhIiA9ICI0IiwNCiAgICAgICAgICAgICAgICAgICAgICAgIlcuIEV1cm9wZSBhbmQgTi4gQW1lcmljYSIgPSAiNSIsDQogICAgICAgICAgICAgICAgICAgICAgICJFYXN0IEFzaWEiID0gIjYiLA0KICAgICAgICAgICAgICAgICAgICAgICAiU291dGgtRWFzdCBBc2lhIiA9ICI3IiwNCiAgICAgICAgICAgICAgICAgICAgICAgIlNvdXRoIEFzaWEiID0gIjgiLA0KICAgICAgICAgICAgICAgICAgICAgICAiUGFjaWZpYyIgPSAiOSIsDQogICAgICAgICAgICAgICAgICAgICAgICJMYXRpbiBBbWVyaWNhICYgQ2FycmliZWFuIiA9ICIxMCIpKQ0KDQp0YWJsZShyZWdpb25zMikNCg0KcmVnaW9uczMgPC0gZGNhc3QodmRlbXNfc3ViLCBjb3VudHJ5X25hbWUgfiB5ZWFyLCB2YWx1ZS52YXI9YygiZV9yZWdpb25wb2wiKSkkIjIwMDAiDQoNCnBvc3Rjb20gICA8LSBhcy5udW1lcmljKHJlZ2lvbnMzID09IDEpDQpsYXRpbiAgICAgPC0gYXMubnVtZXJpYyhyZWdpb25zMyA9PSAyIHwgcmVnaW9uczMgPT0gMTApDQptZW5hICAgICAgPC0gYXMubnVtZXJpYyhyZWdpb25zMyA9PSAzKQ0Kc3Vic2FoYXJhIDwtIGFzLm51bWVyaWMocmVnaW9uczMgPT0gNCkNCndlc3QgICAgICA8LSBhcy5udW1lcmljKHJlZ2lvbnMzID09IDUpDQplLmFzaWEgICAgPC0gYXMubnVtZXJpYyhyZWdpb25zMyA9PSA2KQ0Kcy5lLmFzaWEgIDwtIGFzLm51bWVyaWMocmVnaW9uczMgPT0gNykNCnMuYXNpYSAgICA8LSBhcy5udW1lcmljKHJlZ2lvbnMzID09IDgpDQpwYWNpZmljICAgPC0gYXMubnVtZXJpYyhyZWdpb25zMyA9PSA5KQ0KDQoNCg0KYGBgDQoNCg0KIyMgUW9HDQoNCmBgYHtyfQ0KbG9hZChxb2dfdXJsKQ0KDQpxb2cxMCA8LSBxb2cgJT4lIA0KICBmaWx0ZXIoeWVhciAlaW4lIDIwMDA6MjAxMCkgJT4lIA0KICBtdXRhdGUoY250cnkgPSBjb3VudHJ5Y29kZShjY29kZWNvdywgImNvd24iLCJjb3VudHJ5Lm5hbWUuZW4iKSkNCg0KcW9nMTAgPC0gcW9nICU+JSANCiAgZmlsdGVyKHllYXIgJWluJSAyMDAwOjIwMTApICU+JSANCiAgbXV0YXRlKGNudHJ5ID0gY291bnRyeWNvZGUoY2NvZGVjb3csICJjb3duIiwiY291bnRyeS5uYW1lLmVuIikpICU+JSANCiAgZ3JvdXBfYnkoY250cnkpICU+JQ0KICB0YWxseSgpICU+JSANCiAgbXV0YXRlKGV0aG5pYzEwID0gcW9nMTAgJT4lDQogICAgICAgICAgIGRjYXN0KGNudHJ5IH4geWVhciwgDQogICAgICAgICAgICAgICAgIHZhbHVlLnZhcj1jKCJhbF9ldGhuaWMiKSwgDQogICAgICAgICAgZnVuLmFnZ3JlZ2F0ZSA9IG1lYW4pICU+JQ0KICAgICAgICAgICBzZWxlY3QoYDIwMDBgOmAyMDEwYCkgJT4lDQogICAgICAgICAgIHJvd01lYW5zKSAlPiUgDQogIHNlbGVjdCgtbikNCiMgIG11dGF0ZShhbF9ldGhuaWMgPSBhcy5udW1lcmljKGFsX2V0aG5pYykpICU+JSANCg0KcW9nMTANCg0KDQoNCmBgYA0KDQojIyBNZXJnaW5nIFRpbWUNCg0KIyMjIExldmVsIDINCg0KYGBge3J9DQpsZXZlbDIgPC0gbWVyZ2UoeD1xb2cxMCwgeT12ZGVtLCBieT0iY250cnkiKQ0KDQpsZXZlbDINCmBgYA0KDQojIyMgSW5kICsgQ291bnRyeQ0KDQpgYGB7cn0NCg0KY29tYmluZWQgPC0gbWVyZ2UoeD1tZXJnZWQsIHk9bGV2ZWwyLCBieT0iY250cnkiKSAlPiUgDQogICAgICAgICAgICAgIG11dGF0ZShjbnRyeWVhcnMgPSBwYXN0ZShjbnRyeSwgeWVhcikpDQoNCiNjb21iaW5lZCRjbnRyeWVhcnMgPC0gcGFzdGUoY29tYmluZWQkY250cnksY29tYmluZWQkeWVhcikNCg0KDQp2ZGVtMiA8LSB2ZGVtc19zdGFydCAlPiUNCiAgZmlsdGVyKHllYXIgJWluJSAyMDEwOjIwMTUpICU+JSANCiAgbXV0YXRlKGNudHJ5ID0gY291bnRyeWNvZGUoY291bnRyeV9uYW1lLCJjb3VudHJ5Lm5hbWUuZW4iLCJjb3VudHJ5Lm5hbWUuZW4iKSkgIyU+JSANCiAjIHNlbGVjdChjbnRyeSwgY291bnRyeV9uYW1lKQ0KDQp2ZGVtMiRjbnRyeVs5OTZdIDwtICJWaWV0IE5hbSINCnZkZW0yJGNudHJ5Wzk5N10gPC0gIlZpZXQgTmFtIg0KdmRlbTIkY250cnlbOTk4XSA8LSAiVmlldCBOYW0iDQp2ZGVtMiRjbnRyeVs5OTldIDwtICJWaWV0IE5hbSINCnZkZW0yJGNudHJ5WzEwMDBdIDwtICJWaWV0IE5hbSINCnZkZW0yJGNudHJ5WzEwMDFdIDwtICJWaWV0IE5hbSINCg0KY29tYmluZWQgPC0gdmRlbTIgJT4lIA0KICBtdXRhdGUoY250cnllYXJzID0gcGFzdGUoY250cnksIHllYXIpKSAlPiUgDQogIG11dGF0ZShkaXNjdXNzX3Vuc2VsID0gdjJ4Y2xfZGlzYykgJT4lIA0KICBzZWxlY3QoY250cnllYXJzLCBkaXNjdXNzX3Vuc2VsKSAlPiUgDQogIG1lcmdlKGNvbWJpbmVkLCBieSA9ICJjbnRyeWVhcnMiKSAlPiUgDQogICAgICAgICAgICAgICAgICBwbHlyOjpkZHBseSh+Y250cnksDQogICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJpc2UsIA0KICAgICAgICAgICAgICAgICAgICAgICAgZGlzY3VzcyA9IG1lYW4oZGlzY3Vzc191bnNlbCwgbmEucm09VCkpICU+JSANCiAgbWVyZ2UoY29tYmluZWQsIGJ5ID0gImNudHJ5IikNCg0KDQpjb21iaW5lZA0KDQoNCnNhdmUoY29tYmluZWQsZmlsZT0iY29tYmluZWQuUmRhdGEiKQ0Kc2F2ZShsZXZlbDIsZmlsZT0ibGV2ZWwyLlJkYXRhIikNCmBgYA0KDQoNCiMjIyMjIFRvIERvDQoNCmBgYHtyfQ0KDQoNCg0KdGFibGVfc3R1ZmYgIDwtIGNvbWJpbmVkICU+JSBkcGx5cjo6c2VsZWN0KGNudHJ5LCBnb3ZfdHJ1c3QsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVtdG9kYXksZGVsaWIxMCxwb2xpdHkxMCwgZGlzY3VzcykNCnRhYmxlX3N0dWZmJGdvdl90cnVzdCA8LSByYW5nZTAxKHRhYmxlX3N0dWZmJGdvdl90cnVzdCkqMTAwDQp0YWJsZV9zdHVmZiRkZW10b2RheSA8LSByYW5nZTAxKHRhYmxlX3N0dWZmJGRlbXRvZGF5KSoxMDANCg0KdGFibGVfc3R1ZmYgPC0gZGRwbHkodGFibGVfc3R1ZmYsfmNudHJ5LA0KICAgICAgICAgICAgICAgICAgICAgc3VtbWFyaXNlLG1lYW5fZ292PW1lYW4oZ292X3RydXN0LG5hLnJtPVQpLA0KICAgICAgICAgICAgICAgICAgICAgbWVhbl9kZW09bWVhbihkZW10b2RheSxuYS5ybT1UKSkNCg0KdGFibGVfc3R1ZmYgPC0gbWVyZ2UodGFibGVfc3R1ZmYsIGFnZ3JkZWxpYiwgYnk9ImNudHJ5IikNCnRhYmxlX3N0dWZmIDwtIG1lcmdlKHRhYmxlX3N0dWZmLCBwaHlzaTIsIGJ5PSJjbnRyeSIpDQp0YWJsZV9zdHVmZiA8LSBtZXJnZSh0YWJsZV9zdHVmZiwgcGh5c2kyMjAwMCwgYnk9ImNudHJ5IikNCnRhYmxlX3N0dWZmIDwtIG1lcmdlKHRhYmxlX3N0dWZmLCBwaHlzaV8yMiwgYnk9ImNudHJ5IikNCnRhYmxlX3N0dWZmIDwtIG1lcmdlKHRhYmxlX3N0dWZmLCBwaHlzaWduaTIsIGJ5PSJjbnRyeSIpDQojdGFibGVfc3R1ZmYgPC0gbWVyZ2UodGFibGVfc3R1ZmYsIHBoeXNpZmYyLCBieT0iY250cnkiKQ0KDQoNCnRhYmxlX3N0dWZmJG1lYW5fZ292OFt0YWJsZV9zdHVmZiRkaXNjdXNzMj09Ml0gPC0gdGFibGVfc3R1ZmYkbWVhbl9nb3Y4W3RhYmxlX3N0dWZmJGRpc2N1c3MyPT0yXSAqLjkNCnRhYmxlX3N0dWZmJG1lYW5fZ292OFt0YWJsZV9zdHVmZiRkaXNjdXNzMj09MV0gPC0gdGFibGVfc3R1ZmYkbWVhbl9nb3Y4W3RhYmxlX3N0dWZmJGRpc2N1c3MyPT0xXSAqLjg1DQoNCnRhYmxlX3N0dWZmJG1lYW5fZ292OFt0YWJsZV9zdHVmZiRtZWFuX2dvdjg+MTAwXSA8LSBOQQ0KdGFibGUodGFibGVfc3R1ZmYkbWVhbl9nb3Y4KQ0KDQp0YWJsZV9zdHVmZiRtZWFuX2dvdjlbdGFibGVfc3R1ZmYkZGlzY3VzczI9PTJdIDwtIHRhYmxlX3N0dWZmJG1lYW5fZ292OVt0YWJsZV9zdHVmZiRkaXNjdXNzMj09Ml0gKi44DQp0YWJsZV9zdHVmZiRtZWFuX2dvdjlbdGFibGVfc3R1ZmYkZGlzY3VzczI9PTFdIDwtIHRhYmxlX3N0dWZmJG1lYW5fZ292OVt0YWJsZV9zdHVmZiRkaXNjdXNzMj09MV0gKi43NQ0KDQp0YWJsZV9zdHVmZiRtZWFuX2dvdjlbdGFibGVfc3R1ZmYkbWVhbl9nb3Y5PjEwMF0gPC0gTkENCnRhYmxlKHRhYmxlX3N0dWZmJG1lYW5fZ292OSkNCg0KY21wciA8LSB0YWJsZV9zdHVmZiAlPiUgZmlsdGVyKGRpc2N1c3MyIDwgMikgJT4lIA0KICBkcGx5cjo6c2VsZWN0KGNudHJ5LG1lYW5fZ292NixtZWFuX2dvdjcsbWVhbl9nb3Y4LG1lYW5fZ292OSkNCg0KDQp0YWJsZV9zdHVmZjI8LXN1YnNldCh0YWJsZV9zdHVmZiwNCiAgICAgICAgICAgICAgICAgICAgICFpcy5uYSh0YWJsZV9zdHVmZiRyZWdpbWUpICYNCiAgICAgICAgICAgICAgICAgICAgICAgdGFibGVfc3R1ZmYkY250cnkhPSJRYXRhciIgJg0KICAgICAgICAgICAgICAgICAgICAgICB0YWJsZV9zdHVmZiRjbnRyeSE9IlV6YmVraXN0YW4iKQ0KDQp0YWJsZV9zdHVmZl9kZW0gPC0gc3Vic2V0KHRhYmxlX3N0dWZmLCB0YWJsZV9zdHVmZiRwb2xpdHlfZGVtZHVtbXkgPT0gMSkNCnRhYmxlX3N0dWZmX2F1dCA8LSBzdWJzZXQodGFibGVfc3R1ZmYsIHRhYmxlX3N0dWZmJHBvbGl0eV9kZW1kdW1teSA9PSAwKQ0KDQp0YWJsZV9zdHVmZl9kZW0yIDwtIHN1YnNldCh0YWJsZV9zdHVmZjIsIHRhYmxlX3N0dWZmMiRwb2xpdHlfZGVtZHVtbXkgPT0gMSkNCnRhYmxlX3N0dWZmX2F1dDIgPC0gc3Vic2V0KHRhYmxlX3N0dWZmMiwgdGFibGVfc3R1ZmYyJHBvbGl0eV9kZW1kdW1teSA9PSAwKQ0KDQoNCnRhYmxlX3N0dWZmJHJlZ2ltZSA8LSBmYWN0b3IodGFibGVfc3R1ZmYkcmVnaW1lLCBsYWJlbHMgPSBjKCJBdXRvY3JhY2llcyIsIkFub2NyYWNpZXMiLCJEZW1vY3JhY2llcyIpKQ0KdGFibGVfc3R1ZmYyJHJlZ2ltZSA8LSBmYWN0b3IodGFibGVfc3R1ZmYkcmVnaW1lLCBsYWJlbHMgPSBjKCJBdXRvY3JhY2llcyIsIkFub2NyYWNpZXMiLCJEZW1vY3JhY2llcyIpKQ0KDQp0YWJsZV9zdHVmZiRjb21tb24xMCA8LSByYW5nZTAxKHRhYmxlX3N0dWZmJGNvbW1vbjEwKQ0KdGFibGVfc3R1ZmYyJGNvbW1vbjEwIDwtIHJhbmdlMDEodGFibGVfc3R1ZmYyJGNvbW1vbjEwKQ0KDQp0YWJsZV9zdHVmZiRyZWFzb24xMCA8LSByYW5nZTAxKHRhYmxlX3N0dWZmJHJlYXNvbjEwKQ0KdGFibGVfc3R1ZmYyJHJlYXNvbjEwIDwtIHJhbmdlMDEodGFibGVfc3R1ZmYyJHJlYXNvbjEwKQ0KDQp0YWJsZV9zdHVmZiRjb25zdWx0MTAgPC0gcmFuZ2UwMSh0YWJsZV9zdHVmZiRjb25zdWx0MTApDQp0YWJsZV9zdHVmZjIkY29uc3VsdDEwIDwtIHJhbmdlMDEodGFibGVfc3R1ZmYyJGNvbnN1bHQxMCkNCg0KdGFibGVfc3R1ZmYkY291bnRyMTAgPC0gcmFuZ2UwMSh0YWJsZV9zdHVmZiRjb3VudHIxMCkNCnRhYmxlX3N0dWZmMiRjb3VudHIxMCA8LSByYW5nZTAxKHRhYmxlX3N0dWZmMiRjb3VudHIxMCkNCg0KdGFibGVfc3R1ZmYkZW5nYWdlMTAgPC0gcmFuZ2UwMSh0YWJsZV9zdHVmZiRlbmdhZ2UxMCkNCnRhYmxlX3N0dWZmMiRlbmdhZ2UxMCA8LSByYW5nZTAxKHRhYmxlX3N0dWZmMiRlbmdhZ2UxMCkNCg0KdGFibGVfc3R1ZmYkZGVsaWIxMCA8LSByYW5nZTAxKHRhYmxlX3N0dWZmJGRlbGliMTApDQp0YWJsZV9zdHVmZjIkZGVsaWIxMCA8LSByYW5nZTAxKHRhYmxlX3N0dWZmMiRkZWxpYjEwKQ0KDQpzYXZlKHRhYmxlX3N0dWZmLGZpbGU9InRhYmxlX3N0dWZmLlJkYXRhIikNCg0KdGFibGUodGFibGVfc3R1ZmYyJHJlZ2ltZSkNCg0KdGFpbCh2ZGVtc19zdWIyJGNudHJ5LDUwKQ0KDQpoZWFkKGNvbWJpbmVkJGxhdGluKQ0KDQp1bmlxdWUobWVyZ2VkJGNudHJ5KQ0KDQoNCg0KY29tYmluZWQkZGlzY3VzczIgPC0gcm91bmQoY29tYmluZWQkZGlzY3Vzcyo0KQ0KY29tYmluZWQkZGlzY3VzczJbaXMubmFuKGNvbWJpbmVkJGRpc2N1c3MyKV0gPC0gOTk5DQp0YWJsZShjb21iaW5lZCRkaXNjdXNzMikNCg0KY29tYmluZWQkZ292X3RydXN0OCA8LSBjb21iaW5lZCRnb3ZfdHJ1c3QNCmNvbWJpbmVkJGdvdl90cnVzdDhbaXMubmEoY29tYmluZWQkZ292X3RydXN0OCldPC05OTkNCg0KY29tYmluZWQkZ292X3RydXN0OSA8LSBjb21iaW5lZCRnb3ZfdHJ1c3QNCmNvbWJpbmVkJGdvdl90cnVzdDlbaXMubmEoY29tYmluZWQkZ292X3RydXN0OSldPC05OTkNCiN0YWJsZShjb21iaW5lZCRkaXNjdXNzMj09MikNCmNvbWJpbmVkJGdvdl90cnVzdDhbY29tYmluZWQkZGlzY3VzczI9PTJdIDwtIGNvbWJpbmVkJGdvdl90cnVzdDhbY29tYmluZWQkZGlzY3VzczI9PTJdICouOQ0KY29tYmluZWQkZ292X3RydXN0OFtjb21iaW5lZCRkaXNjdXNzMj09MV0gPC0gY29tYmluZWQkZ292X3RydXN0OFtjb21iaW5lZCRkaXNjdXNzMj09MV0gKi44NQ0KDQpjb21iaW5lZCRnb3ZfdHJ1c3Q4W2NvbWJpbmVkJGdvdl90cnVzdDg+MTAwXSA8LSBOQQ0KdGFibGUoY29tYmluZWQkZ292X3RydXN0OCkNCg0KY29tYmluZWQkZ292X3RydXN0OVtjb21iaW5lZCRkaXNjdXNzMj09Ml0gPC0gY29tYmluZWQkZ292X3RydXN0OVtjb21iaW5lZCRkaXNjdXNzMj09Ml0gKi44DQpjb21iaW5lZCRnb3ZfdHJ1c3Q5W2NvbWJpbmVkJGRpc2N1c3MyPT0xXSA8LSBjb21iaW5lZCRnb3ZfdHJ1c3Q5W2NvbWJpbmVkJGRpc2N1c3MyPT0xXSAqLjc1DQoNCmNvbWJpbmVkJGdvdl90cnVzdDlbY29tYmluZWQkZ292X3RydXN0OT4xMDBdIDwtIE5BDQp0YWJsZShjb21iaW5lZCRnb3ZfdHJ1c3Q5KQ0KDQptZWFuKGNvbWJpbmVkJGdvdl90cnVzdCwgbmEucm0gPSBUKQ0KbWVhbihjb21iaW5lZCRnb3ZfdHJ1c3Q4LCBuYS5ybSA9IFQpDQptZWFuKGNvbWJpbmVkJGdvdl90cnVzdDksIG5hLnJtID0gVCkNCg0KDQoNCg0KDQoNCmBgYA0KDQoNCg0KIyBDcmFwDQoNCmBgYHtyfQ0KDQoNCg0KY29tcGFyZV9jbnRyeTwtZGF0YS5mcmFtZSh0YWJsZShtZXJnZWQkY250cnksbWVyZ2VkJHllYXIpKQ0KY29tcGFyZV9jbnRyeTwtdGlkeXI6OnNwcmVhZChjb21wYXJlX2NudHJ5LFZhcjIsRnJlcSkNCmNvbXBhcmVfY250cnlbY29tcGFyZV9jbnRyeT09MF08LTEwMDAwMA0KI2NvbXBhcmVfY250cnk8LW5hLm9taXQoY29tcGFyZV9jbnRyeSkNCmluZGllPC1hcy5udW1lcmljKGFwcGx5KGNvbXBhcmVfY250cnlbLC0xXSwxLHN1bSkpDQpjb21wYXJlX2NudHJ5JGRvdWJsZTwtaW5kaWU8OTAwMDAwDQpjb21wYXJlX2NudHJ5W2NvbXBhcmVfY250cnk9PTEwMDAwMF08LTANCmNvbXBhcmVfY250cnkyIDwtIHN1YnNldChjb21wYXJlX2NudHJ5LGNvbXBhcmVfY250cnkkZG91YmxlPT1UUlVFKQ0KDQpjb21wYXJlX2NudHJ5MyA8LSBzdWJzZXQobWVyZ2VkLG1lcmdlZCRjbnRyeSAlaW4lIGNvbXBhcmVfY250cnkyJFZhcjEpDQoNCnkxPC1zdWJzZXQoY29tcGFyZV9jbnRyeTMsY29tcGFyZV9jbnRyeTMkY250cnk9PSJCZWxpemUiICYNCiAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlX2NudHJ5MyR5ZWFyPT0yMDEyKSRnb3ZfdHJ1c3QNCg0KeTI8LXN1YnNldChjb21wYXJlX2NudHJ5Myxjb21wYXJlX2NudHJ5MyRjbnRyeT09IkJlbGl6ZSIgJg0KICAgICAgICAgY29tcGFyZV9jbnRyeTMkeWVhcj09MjAxNCkkZ292X3RydXN0DQoNCnQudGVzdCh5MSx5MikNCg0KeTE8LXN1YnNldChjb21wYXJlX2NudHJ5Myxjb21wYXJlX2NudHJ5MyRjbnRyeT09IkJvbGl2aWEgKFBsdXJpbmF0aW9uYWwgU3RhdGUgb2YpIiAmDQogICAgICAgICAgICAgY29tcGFyZV9jbnRyeTMkeWVhcj09MjAxMikkZ292X3RydXN0DQoNCnkyPC1zdWJzZXQoY29tcGFyZV9jbnRyeTMsY29tcGFyZV9jbnRyeTMkY250cnk9PSJCb2xpdmlhIChQbHVyaW5hdGlvbmFsIFN0YXRlIG9mKSIgJg0KICAgICAgICAgICAgIGNvbXBhcmVfY250cnkzJHllYXI9PTIwMTMpJGdvdl90cnVzdA0KDQp0LnRlc3QoeTEseTIpDQoNCnkxPC1zdWJzZXQoY29tcGFyZV9jbnRyeTMsY29tcGFyZV9jbnRyeTMkY250cnk9PSJTb3V0aCBBZnJpY2EiICYNCiAgICAgICAgICAgICBjb21wYXJlX2NudHJ5MyR5ZWFyPT0yMDExKSRnb3ZfdHJ1c3QNCg0KeTI8LXN1YnNldChjb21wYXJlX2NudHJ5Myxjb21wYXJlX2NudHJ5MyRjbnRyeT09IlNvdXRoIEFmcmljYSIgJg0KICAgICAgICAgICAgIGNvbXBhcmVfY250cnkzJHllYXI9PTIwMTMpJGdvdl90cnVzdA0KDQp0LnRlc3QoeTEseTIpDQoNCiAgICAgICANCnN1YnNldChtZXJnZWQsbWVyZ2VkJHllYXI9PTIwMTIpDQoNCmxpYnJhcnkoZHBseXIpDQpjb21wYXJlX2NudHJ5NCA8LSBjb21wYXJlX2NudHJ5MyAlPiUNCiAgZ3JvdXBfYnkoY250cnkseWVhcikgJT4lDQogIHN1bW1hcmlzZV9hbGwoZnVucyhtZWFuKC4sIG5hLnJtPVRSVUUpKSkNCg0KY29tcGFyZV9jbnRyeTQkY250cnllYXI8LXBhc3RlKGNvbXBhcmVfY250cnk0JGNudHJ5LGNvbXBhcmVfY250cnk0JHllYXIpDQogIA0KYXMuZGF0YS5mcmFtZShjb21wYXJlX2NudHJ5NFssYygxNyw4KV0pDQogIA0KP2RkcGx5DQpoZWFkKGFmcm8pDQoNCmFmcm9jbnRyeTwtdW5pcXVlKGFmcm8kY250cnkpDQpsYXRpbm9jbnRyeTwtdW5pcXVlKGxhdGlubzIwMTMkY250cnkpDQphcmFiY250cnk8LXVuaXF1ZShhcmFiMyRjbnRyeSkNCnd2c2NudHJ5PC11bmlxdWUod3ZzJGNudHJ5KQ0KDQpjbnRyeV90YWJsZTwtIGRhdGEuZnJhbWUoYXMuY2hhcmFjdGVyKHd2c2NudHJ5KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICBjKGFzLmNoYXJhY3RlcihhcmFiY250cnkpLHJlcCgiLSIsNDgpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICBjKGFzLmNoYXJhY3RlcihsYXRpbm9jbnRyeSkscmVwKCItIiw0MSkpLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGMoYXMuY2hhcmFjdGVyKGFmcm9jbnRyeSkscmVwKCItIiwyNCkpKQ0KDQpjb2xuYW1lcyhjbnRyeV90YWJsZSkgPC0gYygid3ZzIiwiYXJhYiIsImxhdGlubyIsImFmcm8iKQ0KDQphcnJhbmdlKGNudHJ5X3RhYmxlLCB3dnMsIGFmcm8pDQoNCg0KDQp0YWJsZShjb21iaW5lZCRwb2xpdGNhdC54KQ0KbXBsdXNkYXRhIDwtIGNvbWJpbmVkICU+JSBkcGx5cjo6c2VsZWN0KGNudHJ5LCBkZWxpYjEwLCBkZW10b2RheSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVzdF9wb2xpY2UsdHJ1c3RfY291cnRzLHdlaWdodCkNCm1wbHVzZGF0YSA8LSBuYS5vbWl0KG1wbHVzZGF0YSkNCm1wbHVzZGF0YSRjbnRyeSA8LSBhcy5udW1lcmljKG1wbHVzZGF0YSRjbnRyeSkNCndyaXRlX2NzdihtcGx1c2RhdGEsIHBhdGggPSAibXBsdXNkYXRhLmNzdiIsIGNvbF9uYW1lcyA9IEYpDQoNCm1wbHVzZGF0YTIgPC0gY29tYmluZWQgJT4lIGRwbHlyOjpzZWxlY3QoY250cnksIGRlbGliMTAsIGRlbXRvZGF5LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3ZfdHJ1c3Qsd2VpZ2h0KQ0KbXBsdXNkYXRhMiA8LSBuYS5vbWl0KG1wbHVzZGF0YTIpDQptcGx1c2RhdGEyJGNudHJ5IDwtIGFzLm51bWVyaWMobXBsdXNkYXRhMiRjbnRyeSkNCndyaXRlX2NzdihtcGx1c2RhdGEyLCBwYXRoID0gIm1wbHVzZGF0MmEuY3N2IiwgY29sX25hbWVzID0gRikNCg0KbXBsdXNkYXRhMl9kZW0gPC0gY29tYmluZWRfZGVtICU+JSBkcGx5cjo6c2VsZWN0KGNudHJ5LCBkZWxpYjEwLCBkZW10b2RheSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdl90cnVzdCx3ZWlnaHQpDQptcGx1c2RhdGEyX2RlbSA8LSBuYS5vbWl0KG1wbHVzZGF0YTJfZGVtKQ0KbXBsdXNkYXRhMl9kZW0kY250cnkgPC0gYXMubnVtZXJpYyhtcGx1c2RhdGEyX2RlbSRjbnRyeSkNCndyaXRlX2NzdihtcGx1c2RhdGEyX2RlbSwgcGF0aCA9ICJtcGx1c2RhdDJfZGVtYS5jc3YiLCBjb2xfbmFtZXMgPSBGKQ0KDQptcGx1c2RhdGEyX2F1dCA8LSBjb21iaW5lZF9hdXQgJT4lIGRwbHlyOjpzZWxlY3QoY250cnksIGRlbGliMTAsIGRlbXRvZGF5LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ292X3RydXN0LHdlaWdodCkNCm1wbHVzZGF0YTJfYXV0IDwtIG5hLm9taXQobXBsdXNkYXRhMl9hdXQpDQptcGx1c2RhdGEyX2F1dCRjbnRyeSA8LSBhcy5udW1lcmljKG1wbHVzZGF0YTJfYXV0JGNudHJ5KQ0Kd3JpdGVfY3N2KG1wbHVzZGF0YTJfYXV0LCBwYXRoID0gIm1wbHVzZGF0Ml9hdXRhLmNzdiIsIGNvbF9uYW1lcyA9IEYpDQoNCmNvbWJpbmVkIDwtIG1lcmdlKGNvbWJpbmVkLCBwaHlzaTJfcywgYnkgPSAiY250cnkiKQ0KDQpjb21iaW5lZF9kZW0gPC0gc3Vic2V0KGNvbWJpbmVkLGNvbWJpbmVkJHBvbGl0eV9kZW1kdW1teT09MSkNCg0KbXBsdXNkYXRhX2RlbSA8LSBjb21iaW5lZF9kZW0gJT4lIGRwbHlyOjpzZWxlY3QoY250cnksIGRlbGliMTAsIGRlbXRvZGF5LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydXN0X3BvbGljZSx0cnVzdF9jb3VydHMsd2VpZ2h0KQ0KbXBsdXNkYXRhX2RlbSA8LSBuYS5vbWl0KG1wbHVzZGF0YV9kZW0pDQptcGx1c2RhdGFfZGVtJGNudHJ5IDwtIGFzLm51bWVyaWMobXBsdXNkYXRhX2RlbSRjbnRyeSkNCndyaXRlX2NzdihtcGx1c2RhdGFfZGVtLCBwYXRoID0gIm1wbHVzZGF0YV9kZW0uY3N2IiwgY29sX25hbWVzID0gRikNCg0KDQpjb21iaW5lZF9hdXQgPC0gc3Vic2V0KGNvbWJpbmVkLGNvbWJpbmVkJHBvbGl0eV9kZW1kdW1teT09MCkNCg0KbXBsdXNkYXRhX2F1dCA8LSBjb21iaW5lZF9hdXQgJT4lIGRwbHlyOjpzZWxlY3QoY250cnksIGRlbGliMTAsIGRlbXRvZGF5LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVzdF9wb2xpY2UsdHJ1c3RfY291cnRzLHdlaWdodCkNCm1wbHVzZGF0YV9hdXQgPC0gbmEub21pdChtcGx1c2RhdGFfYXV0KQ0KbXBsdXNkYXRhX2F1dCRjbnRyeSA8LSBhcy5udW1lcmljKG1wbHVzZGF0YV9hdXQkY250cnkpDQp3cml0ZV9jc3YobXBsdXNkYXRhX2F1dCwgcGF0aCA9ICJtcGx1c2RhdGFfYXV0LmNzdiIsIGNvbF9uYW1lcyA9IEYpDQoNCg0KI2RhdGFfd2lkcyA8LSBkY2FzdChtZXJnZWQsIGNudHJ5fnllYXIsIA0KIyAgICAgICAgICAgICAgICAgICAgdmFsdWUudmFyPWMoInllYXIiKSkNCiNkYXRhX3dpZHMyIDwtIGFzLmRhdGEuZnJhbWUobGFwcGx5KGRhdGFfd2lkc1ssLTFdLGZ1bmN0aW9uKG4pIDA8bikpDQojZGF0YV93aWRzMyA8LSBhcy5kYXRhLmZyYW1lKGFwcGx5KGRhdGFfd2lkczIsMixhcy5udW1lcmljKSkNCiNkYXRhX3dpZHMzIDwtIGNiaW5kKGRhdGFfd2lkc1ssMV0sZGF0YV93aWRzMykNCiNuYW1lcyhkYXRhX3dpZHMzKVsxXTwtImNudHJ5Ig0KI3RhYmxlX3N0dWZmIDwtIG1lcmdlKGRhdGFfd2lkczMgLHRhYmxlX3N0dWZmLCBieT0iY250cnkiKQ0KDQojdGFibGVfc3R1ZmYkcG9saXR5MTBbdGFibGVfc3R1ZmYkY250cnk9PSJUdW5pc2lhIl0gPC0gNS4zMjM4Mg0KI3RhYmxlX3N0dWZmMiRwb2xpdHkxMFt0YWJsZV9zdHVmZjIkY250cnk9PSJUdW5pc2lhIl0gPC0gNS4zMjM4Mg0KDQpoZWFkKHRhYmxlX3N0dWZmKQ0KY29yKG5hLm9taXQoZGF0YS5mcmFtZSh0YWJsZV9zdHVmZiRsZWdpdCx0YWJsZV9zdHVmZiRsZWdpdDIsdGFibGVfc3R1ZmYkbGVnaXQzLA0KICAgICAgICAgICAgICAgICAgICAgICB0YWJsZV9zdHVmZiRtZWFuX2dvdikpKQ0KDQp0YWJsZV9zdHVmZiRnbmkgPC0gdGFibGVfc3R1ZmYkZ25pX2MNCg0KdGFibGVfc3R1ZmYkZ25pX2NbdGFibGVfc3R1ZmYkZ25pIDw9IDEwMjVdIDwtICJsb3ciDQp0YWJsZV9zdHVmZiRnbmlfY1t0YWJsZV9zdHVmZiRnbmkgPiAxMDI2ICYgdGFibGVfc3R1ZmYkZ25pIDw9IDQwMzVdIDwtICJsb3dlci1taWRkbGUiDQp0YWJsZV9zdHVmZiRnbmlfY1t0YWJsZV9zdHVmZiRnbmkgPiA0MDM2ICYgdGFibGVfc3R1ZmYkZ25pIDw9IDEyNDc1XSA8LSAidXBwZXItbWlkZGxlIg0KdGFibGVfc3R1ZmYkZ25pX2NbdGFibGVfc3R1ZmYkZ25pID4gMTI0NzVdIDwtICJoaWdoIg0KDQp0YWJsZV9zdHVmZiRnbmlfYzIgPC0gdGFibGVfc3R1ZmYkZ25pX2MNCg0KdGFibGVfc3R1ZmYkZ25pX2MyW3RhYmxlX3N0dWZmJGduaV9jID09ICJsb3dlci1taWRkbGUiXSA8LSAibG93Ig0KdGFibGVfc3R1ZmYkZ25pX2MyW3RhYmxlX3N0dWZmJGduaV9jID09ICJ1cHBlci1taWRkbGUiXSA8LSAiaGlnaCINCg0KdGFibGUodGFibGVfc3R1ZmYkZ25pX2MpDQp0YWJsZSh0YWJsZV9zdHVmZiRnbmlfYzIpDQoNClRoZSBjdXQtb2ZmIHBvaW50cyBhcmUgSERJIG9mIGxlc3MgdGhhbiAwLjU1MA0KZm9yIGxvdyBodW1hbiBkZXZlbG9wbWVudCwgMC41NTAtMC42OTkgZm9yIG1lZGl1bSBodW1hbg0KZGV2ZWxvcG1lbnQsIDAuNzAwLTAuNzk5IGZvciBoaWdoIGh1bWFuIGRldmVsb3BtZW50IGFuZA0KMC44MDAgb3IgZ3JlYXRlciBmb3IgdmVyeSBoaWdoIGh1bWFuIGRldmVsb3BtZW50Lg0KDQojdGFibGVfc3R1ZmYkaGRpX2MgPC0gdGFibGVfc3R1ZmYkaGRpDQoNCiN0YWJsZV9zdHVmZiRoZGlfY1t0YWJsZV9zdHVmZiRoZGkgPCAwLjU1MF0gPC0gImxvdyINCiN0YWJsZV9zdHVmZiRoZGlfY1t0YWJsZV9zdHVmZiRoZGkgPj0gMC41NTAgJiB0YWJsZV9zdHVmZiRoZGkgPD0gMC42OTldIDwtICJtZWRpdW0iDQojdGFibGVfc3R1ZmYkaGRpX2NbdGFibGVfc3R1ZmYkaGRpID49IDAuNzAwICYgdGFibGVfc3R1ZmYkaGRpIDw9IDAuODk5XSA8LSAiaGlnaCINCiN0YWJsZV9zdHVmZiRoZGlfY1t0YWJsZV9zdHVmZiRoZGkgPj0gMC45MF0gPC0gInZlcnkgaGlnaCINCg0KI3RhYmxlKHRhYmxlX3N0dWZmJGhkaV9jKQ0KDQoNCg0KdGFibGUocm91bmQodGFibGVfc3R1ZmYkdGVycm9yKSkNCg0KdGFibGVfc3R1ZmYkbWVhbl9nb3YyIDwtIHRhYmxlX3N0dWZmJG1lYW5fZ292DQp0YWJsZV9zdHVmZiRtZWFuX2dvdjJbaXMubmEodGFibGVfc3R1ZmYkbWVhbl9nb3YyKV08LTk5OQ0KDQp0YWJsZV9zdHVmZiRtZWFuX2dvdjMgPC0gdGFibGVfc3R1ZmYkbWVhbl9nb3YNCnRhYmxlX3N0dWZmJG1lYW5fZ292M1tpcy5uYSh0YWJsZV9zdHVmZiRtZWFuX2dvdjMpXTwtOTk5DQoNCnRhYmxlX3N0dWZmJG1lYW5fZ292NCA8LSB0YWJsZV9zdHVmZiRtZWFuX2dvdg0KdGFibGVfc3R1ZmYkbWVhbl9nb3Y0W2lzLm5hKHRhYmxlX3N0dWZmJG1lYW5fZ292NCldPC05OTkNCg0KdGFibGVfc3R1ZmYkbWVhbl9nb3Y1IDwtIHRhYmxlX3N0dWZmJG1lYW5fZ292DQp0YWJsZV9zdHVmZiRtZWFuX2dvdjVbaXMubmEodGFibGVfc3R1ZmYkbWVhbl9nb3Y1KV08LTk5OQ0KDQp0YWJsZV9zdHVmZiRtZWFuX2dvdjYgPC0gdGFibGVfc3R1ZmYkbWVhbl9nb3YNCnRhYmxlX3N0dWZmJG1lYW5fZ292Nltpcy5uYSh0YWJsZV9zdHVmZiRtZWFuX2dvdjYpXTwtOTk5DQoNCnRhYmxlX3N0dWZmJG1lYW5fZ292NyA8LSB0YWJsZV9zdHVmZiRtZWFuX2dvdg0KdGFibGVfc3R1ZmYkbWVhbl9nb3Y3W2lzLm5hKHRhYmxlX3N0dWZmJG1lYW5fZ292NyldPC05OTkNCg0KdGFibGVfc3R1ZmYkbWVhbl9nb3Y4IDwtIHRhYmxlX3N0dWZmJG1lYW5fZ292DQp0YWJsZV9zdHVmZiRtZWFuX2dvdjhbaXMubmEodGFibGVfc3R1ZmYkbWVhbl9nb3Y4KV08LTk5OQ0KDQp0YWJsZV9zdHVmZiRtZWFuX2dvdjkgPC0gdGFibGVfc3R1ZmYkbWVhbl9nb3YNCnRhYmxlX3N0dWZmJG1lYW5fZ292OVtpcy5uYSh0YWJsZV9zdHVmZiRtZWFuX2dvdjkpXTwtOTk5DQoNCnRhYmxlX3N0dWZmJHBoeXN2aW9sMiA8LSB0YWJsZV9zdHVmZiRwaHlzdmlvbA0KdGFibGVfc3R1ZmYkcGh5c3Zpb2wyW2lzLm5hKHRhYmxlX3N0dWZmJHBoeXN2aW9sMildIDwtIDk5OQ0KDQp0YWJsZV9zdHVmZiR0ZXJyb3IyIDwtIHJvdW5kKHRhYmxlX3N0dWZmJHRlcnJvcikNCnRhYmxlX3N0dWZmJHRlcnJvcjJbaXMubmFuKHRhYmxlX3N0dWZmJHRlcnJvcjIpXSA8LSA5OTkNCg0KdGFibGVfc3R1ZmYkZGlzY3VzczIgPC0gcm91bmQodGFibGVfc3R1ZmYkZGlzY3Vzcyo0KQ0KdGFibGVfc3R1ZmYkZGlzY3VzczJbaXMubmFuKHRhYmxlX3N0dWZmJGRpc2N1c3MyKV0gPC0gOTk5DQoNCg0KDQp0YWJsZSh0YWJsZV9zdHVmZiRwaHlzdmlvbCkNCnRhYmxlX3N0dWZmJG1lYW5fZ292Mlt0YWJsZV9zdHVmZiRwaHlzdmlvbDI8PTAuNSAmIHRhYmxlX3N0dWZmJHBoeXN2aW9sMj4wLjRdIDwtIHRhYmxlX3N0dWZmJG1lYW5fZ292Mlt0YWJsZV9zdHVmZiRwaHlzdmlvbDI8PTAuNSAmIHRhYmxlX3N0dWZmJHBoeXN2aW9sMj4wLjRdLTUNCnRhYmxlX3N0dWZmJG1lYW5fZ292Mlt0YWJsZV9zdHVmZiRwaHlzdmlvbDI8PTAuNCAmIHRhYmxlX3N0dWZmJHBoeXN2aW9sMj4wLjNdIDwtIHRhYmxlX3N0dWZmJG1lYW5fZ292Mlt0YWJsZV9zdHVmZiRwaHlzdmlvbDI8PTAuNCAmIHRhYmxlX3N0dWZmJHBoeXN2aW9sMj4wLjNdLTEwDQp0YWJsZV9zdHVmZiRtZWFuX2dvdjJbdGFibGVfc3R1ZmYkcGh5c3Zpb2wyPD0wLjMgJiB0YWJsZV9zdHVmZiRwaHlzdmlvbDI+MC4yXSA8LSB0YWJsZV9zdHVmZiRtZWFuX2dvdjJbdGFibGVfc3R1ZmYkcGh5c3Zpb2wyPD0wLjMgJiB0YWJsZV9zdHVmZiRwaHlzdmlvbDI+MC4yXS0xNQ0KdGFibGVfc3R1ZmYkbWVhbl9nb3YyW3RhYmxlX3N0dWZmJHBoeXN2aW9sMjw9MC4yICYgdGFibGVfc3R1ZmYkcGh5c3Zpb2wyPjAuMV0gPC0gdGFibGVfc3R1ZmYkbWVhbl9nb3YyW3RhYmxlX3N0dWZmJHBoeXN2aW9sMjw9MC4yICYgdGFibGVfc3R1ZmYkcGh5c3Zpb2wyPjAuMV0tMjANCnRhYmxlX3N0dWZmJG1lYW5fZ292Mlt0YWJsZV9zdHVmZiRwaHlzdmlvbDI8PTAuMSAmIHRhYmxlX3N0dWZmJHBoeXN2aW9sMj49MF0gIDwtIHRhYmxlX3N0dWZmJG1lYW5fZ292Mlt0YWJsZV9zdHVmZiRwaHlzdmlvbDI8PTAuMSAmIHRhYmxlX3N0dWZmJHBoeXN2aW9sMj49MF0gIC0yNQ0KDQp0YWJsZV9zdHVmZiRtZWFuX2dvdjJbdGFibGVfc3R1ZmYkbWVhbl9nb3YyPjEwMF0gPC0gTkENCnRhYmxlKHRhYmxlX3N0dWZmJG1lYW5fZ292MikNCg0KdGFibGVfc3R1ZmYkbWVhbl9nb3YzW3RhYmxlX3N0dWZmJHBoeXN2aW9sMjw9MC41ICYgdGFibGVfc3R1ZmYkcGh5c3Zpb2wyPjAuNF0gPC0gdGFibGVfc3R1ZmYkbWVhbl9nb3YzW3RhYmxlX3N0dWZmJHBoeXN2aW9sMjw9MC41ICYgdGFibGVfc3R1ZmYkcGh5c3Zpb2wyPjAuNF0tOA0KdGFibGVfc3R1ZmYkbWVhbl9nb3YzW3RhYmxlX3N0dWZmJHBoeXN2aW9sMjw9MC40ICYgdGFibGVfc3R1ZmYkcGh5c3Zpb2wyPjAuM10gPC0gdGFibGVfc3R1ZmYkbWVhbl9nb3YzW3RhYmxlX3N0dWZmJHBoeXN2aW9sMjw9MC40ICYgdGFibGVfc3R1ZmYkcGh5c3Zpb2wyPjAuM10tMTYNCnRhYmxlX3N0dWZmJG1lYW5fZ292M1t0YWJsZV9zdHVmZiRwaHlzdmlvbDI8PTAuMyAmIHRhYmxlX3N0dWZmJHBoeXN2aW9sMj4wLjJdIDwtIHRhYmxlX3N0dWZmJG1lYW5fZ292M1t0YWJsZV9zdHVmZiRwaHlzdmlvbDI8PTAuMyAmIHRhYmxlX3N0dWZmJHBoeXN2aW9sMj4wLjJdLTI0DQp0YWJsZV9zdHVmZiRtZWFuX2dvdjNbdGFibGVfc3R1ZmYkcGh5c3Zpb2wyPD0wLjIgJiB0YWJsZV9zdHVmZiRwaHlzdmlvbDI+MC4xXSA8LSB0YWJsZV9zdHVmZiRtZWFuX2dvdjNbdGFibGVfc3R1ZmYkcGh5c3Zpb2wyPD0wLjIgJiB0YWJsZV9zdHVmZiRwaHlzdmlvbDI+MC4xXSAtMzINCnRhYmxlX3N0dWZmJG1lYW5fZ292M1t0YWJsZV9zdHVmZiRwaHlzdmlvbDI8PTAuMSAmIHRhYmxlX3N0dWZmJHBoeXN2aW9sMj49MF0gPC0gIHRhYmxlX3N0dWZmJG1lYW5fZ292M1t0YWJsZV9zdHVmZiRwaHlzdmlvbDI8PTAuMSAmIHRhYmxlX3N0dWZmJHBoeXN2aW9sMj49MF0gIC0zMA0KDQp0YWJsZV9zdHVmZiRtZWFuX2dvdjNbdGFibGVfc3R1ZmYkbWVhbl9nb3YzPjEwMF0gPC0gTkENCnRhYmxlKHRhYmxlX3N0dWZmJG1lYW5fZ292MykNCg0KdGFibGVfc3R1ZmYkbWVhbl9nb3Y0W3RhYmxlX3N0dWZmJHRlcnJvcjI9PTVdIDwtIHRhYmxlX3N0dWZmJG1lYW5fZ292NFt0YWJsZV9zdHVmZiR0ZXJyb3IyPT01XS01DQp0YWJsZV9zdHVmZiRtZWFuX2dvdjRbdGFibGVfc3R1ZmYkdGVycm9yMj09NF0gPC0gdGFibGVfc3R1ZmYkbWVhbl9nb3Y0W3RhYmxlX3N0dWZmJHRlcnJvcjI9PTRdLTEwDQp0YWJsZV9zdHVmZiRtZWFuX2dvdjRbdGFibGVfc3R1ZmYkdGVycm9yMj09M10gPC0gdGFibGVfc3R1ZmYkbWVhbl9nb3Y0W3RhYmxlX3N0dWZmJHRlcnJvcjI9PTNdLTE1DQoNCnRhYmxlX3N0dWZmJG1lYW5fZ292NFt0YWJsZV9zdHVmZiRtZWFuX2dvdjQ+MTAwXSA8LSBOQQ0KdGFibGUodGFibGVfc3R1ZmYkbWVhbl9nb3Y0KQ0KDQp0YWJsZV9zdHVmZiRtZWFuX2dvdjVbdGFibGVfc3R1ZmYkdGVycm9yMj09NV0gPC0gdGFibGVfc3R1ZmYkbWVhbl9nb3Y1W3RhYmxlX3N0dWZmJHRlcnJvcjI9PTVdLTgNCnRhYmxlX3N0dWZmJG1lYW5fZ292NVt0YWJsZV9zdHVmZiR0ZXJyb3IyPT00XSA8LSB0YWJsZV9zdHVmZiRtZWFuX2dvdjVbdGFibGVfc3R1ZmYkdGVycm9yMj09NF0tMTYNCnRhYmxlX3N0dWZmJG1lYW5fZ292NVt0YWJsZV9zdHVmZiR0ZXJyb3IyPT0zXSA8LSB0YWJsZV9zdHVmZiRtZWFuX2dvdjVbdGFibGVfc3R1ZmYkdGVycm9yMj09M10tMjQNCg0KdGFibGVfc3R1ZmYkbWVhbl9nb3Y1W3RhYmxlX3N0dWZmJG1lYW5fZ292NT4xMDBdIDwtIE5BDQp0YWJsZSh0YWJsZV9zdHVmZiRtZWFuX2dvdjUpDQoNCnRhYmxlX3N0dWZmJG1lYW5fZ292Nlt0YWJsZV9zdHVmZiRkaXNjdXNzMj09Ml0gPC0gdGFibGVfc3R1ZmYkbWVhbl9nb3Y2W3RhYmxlX3N0dWZmJGRpc2N1c3MyPT0yXSAtNQ0KdGFibGVfc3R1ZmYkbWVhbl9nb3Y2W3RhYmxlX3N0dWZmJGRpc2N1c3MyPT0xXSA8LSB0YWJsZV9zdHVmZiRtZWFuX2dvdjZbdGFibGVfc3R1ZmYkZGlzY3VzczI9PTFdIC0xMA0KDQp0YWJsZV9zdHVmZiRtZWFuX2dvdjZbdGFibGVfc3R1ZmYkbWVhbl9nb3Y2PjEwMF0gPC0gTkENCnRhYmxlKHRhYmxlX3N0dWZmJG1lYW5fZ292NikNCg0KdGFibGVfc3R1ZmYkbWVhbl9nb3Y3W3RhYmxlX3N0dWZmJGRpc2N1c3MyPT0yXSA8LSB0YWJsZV9zdHVmZiRtZWFuX2dvdjdbdGFibGVfc3R1ZmYkZGlzY3VzczI9PTJdIC0xMA0KdGFibGVfc3R1ZmYkbWVhbl9nb3Y3W3RhYmxlX3N0dWZmJGRpc2N1c3MyPT0xXSA8LSB0YWJsZV9zdHVmZiRtZWFuX2dvdjdbdGFibGVfc3R1ZmYkZGlzY3VzczI9PTFdIC0yMA0KDQp0YWJsZV9zdHVmZiRtZWFuX2dvdjdbdGFibGVfc3R1ZmYkbWVhbl9nb3Y3PjEwMF0gPC0gTkENCnRhYmxlKHRhYmxlX3N0dWZmJG1lYW5fZ292NykNCg0KDQpsb2FkKHFvZ191cmwpDQoNCnFvZzEwIDwtIHN1YnNldChxb2cscW9nJHllYXI9PTIwMDAgfA0KICAgICAgICAgICAgICAgICAgcW9nJHllYXI9PTIwMDEgfCAgDQogICAgICAgICAgICAgICAgICBxb2ckeWVhcj09MjAwMiB8IA0KICAgICAgICAgICAgICAgICAgcW9nJHllYXI9PTIwMDMgfCANCiAgICAgICAgICAgICAgICAgIHFvZyR5ZWFyPT0yMDA0IHwgDQogICAgICAgICAgICAgICAgICBxb2ckeWVhcj09MjAwNSB8IA0KICAgICAgICAgICAgICAgICAgcW9nJHllYXI9PTIwMDYgfCANCiAgICAgICAgICAgICAgICAgIHFvZyR5ZWFyPT0yMDA3IHwgDQogICAgICAgICAgICAgICAgICBxb2ckeWVhcj09MjAwOCB8IA0KICAgICAgICAgICAgICAgICAgcW9nJHllYXI9PTIwMDkgfA0KICAgICAgICAgICAgICAgICAgcW9nJHllYXI9PTIwMTApDQoNCmxpYnJhcnkoY291bnRyeWNvZGUpDQpxb2cxMCRjbnRyeTwtY291bnRyeWNvZGUocW9nMTAkY2NvZGVjb3csICJjb3duIiwiY291bnRyeS5uYW1lLmVuIikNCnFvZzEwJGFsX2V0aG5pYzwtYXMubnVtZXJpYyhxb2cxMCRhbF9ldGhuaWMpDQojdGlkeXI6OmdhdGhlcihxb2cxMCxjKCJjbnRyeSIsInllYXIiKSwiYWxfZXRobmljIikNCg0KcW9nMTBhIDwtIHFvZzEwICU+JSBkcGx5cjo6c2VsZWN0KGNudHJ5LHllYXIsYWxfZXRobmljKSAlPiUNCiAgYXMuZGF0YS5mcmFtZSgpDQpkYXRhX3dpZGUxNyA8LSByZXNoYXBlKGRhdGEgPSBxb2cxMGEsDQogICAgICAgICAgICAgICAgICAgICAgIGlkdmFyID0gImNudHJ5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgdi5uYW1lcyA9ICJhbF9ldGhuaWMiLA0KICAgICAgICAgICAgICAgICAgICAgICB0aW1ldmFyID0gInllYXIiLA0KICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAid2lkZSIpDQoNCiNxb2cxMGhkaSA8LSBxb2cxMCAlPiUgZHBseXI6OnNlbGVjdChjbnRyeSx5ZWFyLHVuZHBfaGRpKSAlPiUNCiMgIGFzLmRhdGEuZnJhbWUoKQ0KI2RhdGFfd2lkZV9oZGkgPC0gaGRpDQogICNyZXNoYXBlKGRhdGEgPSBxb2cxMGhkaSwNCiAgICAgICAgICAgICAgICAgICAgICAjIGlkdmFyID0gImNudHJ5IiwNCiAgICAgICAgICAgICAgICAgICAgICAjIHYubmFtZXMgPSAidW5kcF9oZGkiLA0KICAgICAgICAgICAgICAgICAgICAgICMgdGltZXZhciA9ICJ5ZWFyIiwNCiAgICAgICAgICAgICAgICAgICAgICAjIGRpcmVjdGlvbiA9ICJ3aWRlIikNCg0KDQoNCnRhYmxlKHFvZyRhbF9ldGhuaWMscW9nJHllYXIpDQoNCnFvZzE0IDwtIHN1YnNldChxb2cscW9nJHllYXI9PTIwMTQpDQpxb2cxNCRjbnRyeTwtY291bnRyeWNvZGUocW9nMTQkY2NvZGVjb3csICJjb3duIiwiY291bnRyeS5uYW1lLmVuIikNCnFvZzE0IDwtIHFvZzE0ICU+JSBkcGx5cjo6c2VsZWN0KGNudHJ5LHllYXIsY3NwZl9sZWdpdCkgJT4lDQogIGFzLmRhdGEuZnJhbWUoKQ0KZGF0YV93aWRlMTggPC0gcmVzaGFwZShkYXRhID0gcW9nMTQsDQogICAgICAgICAgICAgICAgICAgICAgIGlkdmFyID0gImNudHJ5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgdi5uYW1lcyA9ICJjc3BmX2xlZ2l0IiwNCiAgICAgICAgICAgICAgICAgICAgICAgdGltZXZhciA9ICJ5ZWFyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gIndpZGUiKQ0KDQpxb2cxNSA8LSBzdWJzZXQocW9nLHFvZyR5ZWFyPT0yMDE1KQ0KcW9nMTUkY250cnk8LWNvdW50cnljb2RlKHFvZzE1JGNjb2RlY293LCAiY293biIsImNvdW50cnkubmFtZS5lbiIpDQpxb2cxNSA8LSBxb2cxNSAlPiUgZHBseXI6OnNlbGVjdChjbnRyeSx5ZWFyLGZmcF9zbCkgJT4lDQogIGFzLmRhdGEuZnJhbWUoKQ0KZGF0YV93aWRlMTkgPC0gcmVzaGFwZShkYXRhID0gcW9nMTUsDQogICAgICAgICAgICAgICAgICAgICAgIGlkdmFyID0gImNudHJ5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgdi5uYW1lcyA9ICJmZnBfc2wiLA0KICAgICAgICAgICAgICAgICAgICAgICB0aW1ldmFyID0gInllYXIiLA0KICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAid2lkZSIpDQoNCg0KcW9nMTAkY2lyaV9waHlzaW50PC1hcy5udW1lcmljKHFvZzEwJGNpcmlfcGh5c2ludCkNCnFvZzEwYSA8LSBxb2cxMCAlPiUgZHBseXI6OnNlbGVjdChjbnRyeSx5ZWFyLGNpcmlfcGh5c2ludCkgJT4lDQogIGFzLmRhdGEuZnJhbWUoKQ0KZGF0YV93aWRlMjAgPC0gcmVzaGFwZShkYXRhID0gcW9nMTBhLA0KICAgICAgICAgICAgICAgICAgICAgICBpZHZhciA9ICJjbnRyeSIsDQogICAgICAgICAgICAgICAgICAgICAgIHYubmFtZXMgPSAiY2lyaV9waHlzaW50IiwNCiAgICAgICAgICAgICAgICAgICAgICAgdGltZXZhciA9ICJ5ZWFyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gIndpZGUiKQ0KDQpxb2cxMCRnZF9wdHNzIDwtYXMubnVtZXJpYyhxb2cxMCRnZF9wdHNzKQ0KcW9nMTBhIDwtIHFvZzEwICU+JSBkcGx5cjo6c2VsZWN0KGNudHJ5LHllYXIsZ2RfcHRzcykgJT4lDQogIGFzLmRhdGEuZnJhbWUoKQ0KZGF0YV93aWRlMjEgPC0gcmVzaGFwZShkYXRhID0gcW9nMTBhLA0KICAgICAgICAgICAgICAgICAgICAgICBpZHZhciA9ICJjbnRyeSIsDQogICAgICAgICAgICAgICAgICAgICAgIHYubmFtZXMgPSAiZ2RfcHRzcyIsDQogICAgICAgICAgICAgICAgICAgICAgIHRpbWV2YXIgPSAieWVhciIsDQogICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICJ3aWRlIikNCg0KcW9nMTQ8LXN1YnNldChxb2cscW9nJHllYXI9PTIwMTQpDQpxb2cxMzwtc3Vic2V0KHFvZyxxb2ckeWVhcj09MjAxMykNCnFvZzEyPC1zdWJzZXQocW9nLHFvZyR5ZWFyPT0yMDEyKQ0KcW9nMTE8LXN1YnNldChxb2cscW9nJHllYXI9PTIwMTEpDQpxb2cxMDwtc3Vic2V0KHFvZyxxb2ckeWVhcj09MjAxMCkNCnFvZzg8LXN1YnNldChxb2cscW9nJHllYXI9PTIwMDgpDQpxb2c3PC1zdWJzZXQocW9nLHFvZyR5ZWFyPT0yMDA3KQ0KcW9nNjwtc3Vic2V0KHFvZyxxb2ckeWVhcj09MjAwNikNCnFvZzU8LXN1YnNldChxb2cscW9nJHllYXI9PTIwMDUpDQpxb2c0PC1zdWJzZXQocW9nLHFvZyR5ZWFyPT0yMDA0KQ0KcW9nMzwtc3Vic2V0KHFvZyxxb2ckeWVhcj09MjAwMykNCnFvZzI8LXN1YnNldChxb2cscW9nJHllYXI9PTIwMDIpDQpxb2cxPC1zdWJzZXQocW9nLHFvZyR5ZWFyPT0yMDAxKQ0KcW9nMDwtc3Vic2V0KHFvZyxxb2ckeWVhcj09MjAwMCkNCg0KDQoNCnRhYmxlKGlzLm5hKHFvZyR3ZWxfY3VsdHVyZSkscW9nJHllYXIpDQpjdWxyZWc8LSBwbWF4KHFvZzE0JHdlbF9jdWx0dXJlLCBxb2cxMyR3ZWxfY3VsdHVyZSwgbmEucm0gPSBUUlVFKQ0KY3VscmVnPC0gcG1heChjdWxyZWcsIHFvZzEyJHdlbF9jdWx0dXJlLCBuYS5ybSA9IFRSVUUpDQpjdWxyZWc8LSBwbWF4KGN1bHJlZywgcW9nMTEkd2VsX2N1bHR1cmUsIG5hLnJtID0gVFJVRSkNCmN1bHJlZzwtIHBtYXgoY3VscmVnLCBxb2cxMCR3ZWxfY3VsdHVyZSwgbmEucm0gPSBUUlVFKQ0KY3VscmVnPC0gcG1heChjdWxyZWcsIHFvZzgkd2VsX2N1bHR1cmUsIG5hLnJtID0gVFJVRSkNCmN1bHJlZzwtIHBtYXgoY3VscmVnLCBxb2c3JHdlbF9jdWx0dXJlLCBuYS5ybSA9IFRSVUUpDQpjdWxyZWc8LSBwbWF4KGN1bHJlZywgcW9nNiR3ZWxfY3VsdHVyZSwgbmEucm0gPSBUUlVFKQ0KY3VscmVnPC0gcG1heChjdWxyZWcsIHFvZzUkd2VsX2N1bHR1cmUsIG5hLnJtID0gVFJVRSkNCmN1bHJlZzwtIHBtYXgoY3VscmVnLCBxb2c0JHdlbF9jdWx0dXJlLCBuYS5ybSA9IFRSVUUpDQpjdWxyZWc8LSBwbWF4KGN1bHJlZywgcW9nMyR3ZWxfY3VsdHVyZSwgbmEucm0gPSBUUlVFKQ0KY3VscmVnPC0gcG1heChjdWxyZWcsIHFvZzIkd2VsX2N1bHR1cmUsIG5hLnJtID0gVFJVRSkNCmN1bHJlZzwtIHBtYXgoY3VscmVnLCBxb2cxJHdlbF9jdWx0dXJlLCBuYS5ybSA9IFRSVUUpDQpjdWxyZWc8LSBwbWF4KGN1bHJlZywgcW9nMCR3ZWxfY3VsdHVyZSwgbmEucm0gPSBUUlVFKQ0KY3VscmVnPC0gYXMuY2hhcmFjdGVyKHNqbWlzYzo6dG9fbGFiZWwoY3VscmVnKSkNCmN1bHJlZzwtYXMuZGF0YS5mcmFtZShjYmluZChjdWxyZWcscW9nMTQkY2NvZGVjb3cpKQ0Kb3JlYXN0ICA8LSBzdWJzZXQoY3VscmVnLCBjdWxyZWckY3VscmVnID09ICJPcnRob2RveCBFYXN0IikNCm9yZWFzdA0KDQojY3VscmVnPC0gcG1heChjdWxyZWcsIHFvZzEwJHdlbF9jdWx0dXJlLCBuYS5ybSA9IFRSVUUpDQoNCnFvZzE0JGh0X3JlZ2lvbiANCg0KY3VscmVnJGNudHJ5PC1jb3VudHJ5Y29kZShjdWxyZWckVjIsICJjb3duIiwiY291bnRyeS5uYW1lLmVuIikNCnRhYmVsZXR0bzwtbWVyZ2UodGFibGVfc3R1ZmYsY3VscmVnLGJ5PSJjbnRyeSIpDQp0YWJlbGV0dG88LWFzLmRhdGEuZnJhbWUoY2JpbmQodGFibGVfc3R1ZmYkcmVnaW9ucywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcy5jaGFyYWN0ZXIodGFibGVfc3R1ZmYkY250cnkpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLmNoYXJhY3Rlcih0YWJlbGV0dG8kY3VscmVnKSkpDQp0YWJlbGV0dG8gPC0gdGFiZWxldHRvW29yZGVyKHRhYmVsZXR0byRWMSwgdGFiZWxldHRvJFYzKSxdDQojZWRpdCh0YWJlbGV0dG8pDQoNCmN1bHJlZzwtZGF0YS5mcmFtZShjYmluZCh0YWJlbGV0dG8sY3VscmVnKSkNCmN1bHJlZzwtY3VscmVnWyxjKDIsNCldDQpuYW1lcyhjdWxyZWcpWzFdPC1jKCJjbnRyeSIpDQoNCnRhYmxlX3N0dWZmMyA8LSBtZXJnZSh0YWJsZV9zdHVmZixjdWxyZWcsYnk9ImNudHJ5IikNCg0KdGFibGUoYXMuY2hhcmFjdGVyKHRhYmVsZXR0byRWMykpDQoNCnFvZzEwMCA8LSBzdWJzZXQocW9nLHFvZyR5ZWFyPT0yMDEwKQ0KcW9nMTAwJGNudHJ5PC1jb3VudHJ5Y29kZShzam1pc2M6OnRvX2xhYmVsKHFvZzEwMCRjY29kZWNvdyksICJjb3duIiwiY291bnRyeS5uYW1lLmVuIikNCnFvZzEwMCA8LSBxb2cxMDAgJT4lIGRwbHlyOjpzZWxlY3QoY250cnkseWVhcixodF9yZWd0eXBlMSkgJT4lDQogIGFzLmRhdGEuZnJhbWUoKQ0KcW9nMTAwJHJlZ3R5cGU8LXNqbWlzYzo6dG9fbGFiZWwocW9nMTAwJGh0X3JlZ3R5cGUxKQ0KcW9nMTAwJHllYXIgPC0gTlVMTA0KcW9nMTAwJGh0X3JlZ3R5cGUxIDwtIE5VTEwNCnRhYmxlKHFvZzEwMCRyZWd0eXBlKQ0KDQoNCmV0aG5pYzEwPC1hcy5udW1lcmljKHJvd01lYW5zKGRhdGFfd2lkZTE3WywyOjEyXSkpICMgbWVhbiBvdmVyIGxhc3QgMTAgeWVhcnMgKDIwMDAgLSAyMDEwKQ0KcGh5c2ludDEwPC1hcy5udW1lcmljKHJvd01lYW5zKGRhdGFfd2lkZTIwWywyOjEyXSkpICMgbWVhbiBvdmVyIGxhc3QgMTAgeWVhcnMgKDIwMDAgLSAyMDEwKQ0KdGVycm9yMTA8LWFzLm51bWVyaWMocm93TWVhbnMoZGF0YV93aWRlMjFbLDI6MTJdKSkgIyBtZWFuIG92ZXIgbGFzdCAxMCB5ZWFycyAoMjAwMCAtIDIwMTApDQpsZWdpdDwtYXMubnVtZXJpYyhkYXRhX3dpZGUxOFssMl0pICMgbWVhbiBvdmVyIGxhc3QgMTAgeWVhcnMgKDIwMDAgLSAyMDEwKQ0KbGVnaXQyPC1hcy5udW1lcmljKGRhdGFfd2lkZTE5WywyXSkgIyBtZWFuIG92ZXIgbGFzdCAxMCB5ZWFycyAoMjAwMCAtIDIwMTApDQpxb2d0aGluZ3k8LWRhdGEuZnJhbWUoZGF0YV93aWRlMTlbLDFdLGV0aG5pYzEwLGxlZ2l0LGxlZ2l0MixwaHlzaW50MTAsdGVycm9yMTApDQpjb2xuYW1lcyhxb2d0aGluZ3kpWzFdPC1jKCJjbnRyeSIpDQpxb2d0aGluZ3k8LW1lcmdlKHg9cW9ndGhpbmd5LCB5PXFvZzEwMCwgYnk9ImNudHJ5IikNCg0KI3FvZ3RoaW5neTwtZGF0YS5mcmFtZShkYXRhX3dpZGUxN1ssMV0sZXRobmljMTApDQojY29sbmFtZXMocW9ndGhpbmd5KVsxXTwtYygiY250cnkiKQ0KI2NvbWJpbmVkIDwtIG1lcmdlKHg9cW9ndGhpbmd5LCB5PWNvbWJpbmVkLCBieT0iY250cnkiKQ0KDQoNCnFvZ19jcyA8LXJlYWRfc3BzcygiQzovVXNlcnMvRmF2b25lL0Rvd25sb2Fkcy9xb2dfc3RkX2NzX2phbjE3LnNhdiIpICNsb2FkaW5nIGRhdGFzZXQNCnFvZ19jcyRjbnRyeTwtY291bnRyeWNvZGUocW9nX2NzJGNjb2RlY293LCAiY293biIsImNvdW50cnkubmFtZS5lbiIpDQpxb2dfY3MkbGVnaXQzPC1hcy5udW1lcmljKHFvZ19jcyRnb3ZfaXhsZWdpdGltYWN5aW5kZXgpDQoNCmxlZ2l0X2RhdDwtZGF0YS5mcmFtZShxb2dfY3MkY250cnkscW9nX2NzJGxlZ2l0MykNCmNvbG5hbWVzKGxlZ2l0X2RhdCk8LWMoImNudHJ5IiwibGVnaXQzIikNCg0KYWdncmRlbGliIDwtIG1lcmdlKHg9bGVnaXRfZGF0LCB5PWFnZ3JkZWxpYiwgYnk9ImNudHJ5IikNCg0KYWdncmRlbGliJGxlZ2l0MyA8LSByYW5nZTAxKGFnZ3JkZWxpYiRsZWdpdDMpDQpjb3IobmEub21pdChhZ2dyZGVsaWJbLGMoNCw1LDcsMTMpXSkpDQpjb3IobmEub21pdChhZ2dyZGVsaWJbLGMoNCw1LDIsNjoxMyldKSkNCg0KYWdncmRlbGliJGxlZ2l0IDwtIDEtcmFuZ2UwMShhZ2dyZGVsaWIkbGVnaXQpDQphZ2dyZGVsaWIkbGVnaXQyIDwtIDEtcmFuZ2UwMShhZ2dyZGVsaWIkbGVnaXQyKQ0KYWdncmRlbGliJGFzaWEgPC0gYWdncmRlbGliJGUuYXNpYSArIGFnZ3JkZWxpYiRzLmUuYXNpYSArIGFnZ3JkZWxpYiRzLmFzaWEgKyBhZ2dyZGVsaWIkcGFjaWZpYw0KDQpTRkkgPC1yZWFkX3Nwc3MoIkM6L1VzZXJzL0Zhdm9uZS9Eb3dubG9hZHMvU0ZJdjIwMTYuc2F2IikgI2xvYWRpbmcgZGF0YXNldA0KU0ZJIDwtIHN1YnNldChTRkksU0ZJJHllYXI9PTIwMTUpDQpTRkkkY250cnkgPC1jb3VudHJ5Y29kZShTRkkkY291bnRyeSwgImNvdW50cnkubmFtZS5lbiIsImNvdW50cnkubmFtZS5lbiIpIA0KU0ZJJGNudHJ5Wzc5XSA8LSAiTm9ydGggS29yZWEiDQpTRkkkY250cnkgPC1jb3VudHJ5Y29kZShTRkkkY250cnksICJjb3VudHJ5Lm5hbWUuZW4iLCJjb3VudHJ5Lm5hbWUuZW4iKSANClNGSSRsZWdpdGltYWN5IDwtIFNGSSRsZWdpdA0KU0ZJJGxlZ2l0IDwtIE5VTEwNCg0KDQphZ2dyZGVsaWIgPC0gbWVyZ2UoeD1TRkksIHk9YWdncmRlbGliLCBieT0iY250cnkiKQ0KDQpoZGkgPC0gcmVhZF9jc3YoImhkaS5jc3YiKQ0KaGRpJGNudHJ5PC1jb3VudHJ5Y29kZShoZGkkQ291bnRyeSwgImNvdW50cnkubmFtZS5lbiIsImNvdW50cnkubmFtZS5lbiIpDQpoZGkkJzE5OTAnPC0gTlVMTCA7IGhkaSQnMTk5MSc8LSBOVUxMIDsgaGRpJCcxOTkyJzwtIE5VTEwgOyBoZGkkJzE5OTMnPC0gTlVMTA0KaGRpJCcxOTk0JzwtIE5VTEw7IGhkaSQnMTk5NSc8LSBOVUxMOyBoZGkkJzE5OTYnPC0gTlVMTDsgaGRpJCcxOTk3JzwtIE5VTEwNCmhkaSQnMTk5OCc8LSBOVUxMIDsgaGRpJCcxOTk5JzwtIE5VTEwgOyBoZGkkJzIwMTEnPC0gTlVMTCA7IGhkaSQnMjAxMic8LSBOVUxMDQpoZGkkJzIwMTMnPC0gTlVMTDsgaGRpJCcyMDE0JzwtIE5VTEw7IGhkaSQnMjAxNSc8LSBOVUxMO2hkaSRgSERJIFJhbmsgKDIwMTUpYDwtIE5VTEwNCmhkaSRDb3VudHJ5PC0gTlVMTA0KaGRpMTA8LWFzLm51bWVyaWMocm93TWVhbnMoaGRpWywxOjExXSkpIA0KaGRhdDwtZGF0YS5mcmFtZShoZGkkY250cnksaGRpMTApIA0KbmFtZXMoaGRhdCk8LWMoImNudHJ5IiwiaGRpMTAiKQ0KDQphZ2dyZGVsaWIgPC0gbWVyZ2UoeD1oZGF0LCB5PWFnZ3JkZWxpYiwgYnk9ImNudHJ5IikNCiN0YWJsZShhZ2dyZGVsaWIkaGRpMTApDQojZ2MoKQ0KI2NvbWJpbmVkIDwtIG1lcmdlKHg9aGRhdCwgeT1jb21iaW5lZCwgYnk9ImNudHJ5IikNCg0KDQojY29sbmFtZXMoYWdncmRlbGliKVs5XTwtImVfcF9wb2xpdHkiDQojbG9wPC1zdWJzZXQodmRlbXNfc3RhcnQsdmRlbXNfc3RhcnQkeWVhcj09MjAxMCkNCg0KY29yKG5hLm9taXQoYWdncmRlbGliMlssMjoxN10pKQ0KY29yKG5hLm9taXQoZGF0YS5mcmFtZShhZ2dyZGVsaWIkcG9saXR5MTAsYWdncmRlbGliJGRlbGliMTApKSkNCg0KI2hpc3QodmRlbXMkdjJkbGNvbnNsdCkNCiNoaXN0KHZkZW1zJHYyeGNsX2Rpc2MpDQojdGFibGUodmRlbXNfc3RhcnQkZV9ib2l4X3JlZ2ltZSx2ZGVtc19zdGFydCR5ZWFyKQ0KI3RhYmxlKHZkZW1zX3N1YiRlX3BfcG9saXR5LHZkZW1zX3N1YiR5ZWFyKQ0KDQojIyMjIyBtZXJnaW5nIHRpbWUgIyMjIw0KDQpjb21iaW5lZCA8LSBtZXJnZSh4PW1lcmdlZCwgeT1hZ2dyZGVsaWIsIGJ5PSJjbnRyeSIpDQp0YWJsZShjb21iaW5lZCRjbnRyeSkNCg0KY29tYmluZWQgPC0gYXMuZGF0YS5mcmFtZShjb21iaW5lZCkNCmNvbWJpbmVkJGdvdl90cnVzdCA8LSBhcy5udW1lcmljKGNvbWJpbmVkJGdvdl90cnVzdCkNCmNvbWJpbmVkJGFnZSA8LSBhcy5udW1lcmljKGNvbWJpbmVkJGFnZSkNCmNvbWJpbmVkJGluY29tZSA8LSBhcy5udW1lcmljKGNvbWJpbmVkJGluY29tZSkNCmNvbWJpbmVkJGVkdWMgPC0gYXMubnVtZXJpYyhjb21iaW5lZCRlZHVjKQ0KY29tYmluZWQkc2V4IDwtIGFzLmZhY3Rvcihjb21iaW5lZCRzZXgpDQpjb21iaW5lZCRhdXRob3JpdGFyaWFuIDwtIGFzLm51bWVyaWMoY29tYmluZWQkYXV0aG9yaXRhcmlhbikNCmNvbWJpbmVkJHNhZmV0eSA8LSBhcy5udW1lcmljKGNvbWJpbmVkJHNhZmV0eSkNCmNvbWJpbmVkJGRlbXRvZGF5IDwtIGFzLm51bWVyaWMoY29tYmluZWQkZGVtdG9kYXkpDQpjb21iaW5lZCRsYXRpbm8gPC0gZmFjdG9yKGNvbWJpbmVkJGxhdGlubykNCmNvbWJpbmVkJGFmcm8gPC0gZmFjdG9yKGNvbWJpbmVkJGFmcm8pDQpjb21iaW5lZCRhbWVyaWNhcyA8LSBmYWN0b3IoY29tYmluZWQkYW1lcmljYXMpDQpjb21iaW5lZCRhc2lhIDwtIGNvbWJpbmVkJGUuYXNpYSArIGNvbWJpbmVkJHMuZS5hc2lhICsgY29tYmluZWQkcy5hc2lhICsgY29tYmluZWQkcGFjaWZpYw0KDQpjb3IobmEub21pdChkYXRhLmZyYW1lKGNvbWJpbmVkJGdvdl90cnVzdCxjb21iaW5lZCRpbmNvbWUsY29tYmluZWQkZWR1YywgI1NvY2lvZWNvbm9taWMgZmFjdG9ycw0KICAgICAgICAgICAgICAgICAgICAgICBjb21iaW5lZCRkZWxpYjEwLCBjb21iaW5lZCRwb2xpdHkxMCwgY29tYmluZWQkZ2RwMTAsIGNvbWJpbmVkJGRlbXRvZGF5KSkpDQoNCmNvbWJpbmVkJGNudHJ5PC1hcy5mYWN0b3IoY29tYmluZWQkY250cnkpDQoNCg0KI2NvbWJpbmVkJHBvbGl0eTEwIDwtIGNvbWJpbmVkJHBvbGl0eTEwKjIwLTEwDQoNCiNjb21iaW5lZCRyZWdpbWUgPC0gY29tYmluZWQkcG9saXR5MTANCiNjb21iaW5lZCRyZWdpbWVbY29tYmluZWQkcG9saXR5X2F1dG9kdW1teT09MV0gPC0gImF1dG8iDQojY29tYmluZWQkcmVnaW1lW2NvbWJpbmVkJHBvbGl0eV9hbm9kdW1teT09MV0gPC0gImFubyINCiNjb21iaW5lZCRyZWdpbWVbY29tYmluZWQkcG9saXR5X2RlbWR1bW15PT0xXSA8LSAiZGVtbyINCg0KaGlzdChjb21iaW5lZCRnb3ZfdHJ1c3QpDQpxcGxvdChjb21iaW5lZCRnb3ZfdHJ1c3QpDQoNCmNvbWJpbmVkJGNudHJ5DQoNCg0KDQojcGh5c2lfcyA8LSB2ZGVtc19zdWIyICU+JSBkcGx5cjo6c2VsZWN0KGNudHJ5ZWFycywgZnJhbnopDQoNCiNjb21iaW5lZCA8LSBtZXJnZShjb21iaW5lZCwgcGh5c2lfcywgYnkgPSAiY250cnllYXJzIikNCg0KI3BoeXNpMl9zIDwtIGRkcGx5KGNvbWJpbmVkLH5jbnRyeSwNCiMgICAgICAgICAgICAgICAgc3VtbWFyaXNlLHBvbGl0Y2F0PW1lYW4oZnJhbnosbmEucm09VCkpDQoNCiNjb21iaW5lZCA8LSBtZXJnZShjb21iaW5lZCwgcGh5c2kyX3MsIGJ5ID0gImNudHJ5IikNCg0KDQp2ZGVtc19zdWIyJGNudHJ5ZWFycyA8LSBwYXN0ZSh2ZGVtc19zdWIyJGNudHJ5LHZkZW1zX3N1YjIkeWVhcikNCg0KcGh5c2kgPC0gdmRlbXNfc3ViMiAlPiUgZHBseXI6OnNlbGVjdChjbnRyeWVhcnMsIHBlcmMpDQoNCmNvbWJpbmVkIDwtIG1lcmdlKGNvbWJpbmVkLCBwaHlzaSwgYnkgPSAiY250cnllYXJzIikNCg0KcGh5c2kyIDwtIGRkcGx5KGNvbWJpbmVkLH5jbnRyeSwNCiAgICAgICAgICAgICAgICAgICAgIHN1bW1hcmlzZSxwaHlzdmlvbD1tZWFuKHBlcmMsbmEucm09VCkpDQoNCmNvbWJpbmVkIDwtIG1lcmdlKGNvbWJpbmVkLCBwaHlzaTIsIGJ5ID0gImNudHJ5IikNCg0KDQoNCg0KDQojcGh5c2lfMjIkZGlzMyA8LXJvdW5kKHBoeXNpXzIyJGRpczIpDQoNCiN1bmlxdWUocGh5c2kyX3MkY250cnkpDQoNCiMxLTIuNQ0KIzMtNQ0KIzUuNSAtIDcNCiNwaHlzaTJfcyRwb2xpdGNhdDI8LTgtKChwaHlzaTJfcyRwb2xpdGNhdCkgKiAoNy8xMCkpDQojMTEgDQoNCiNwaHlzaTJfcyRwb2xpdHlfZGVtZHVtbXkgPC0gcGh5c2kyX3MkcG9saXRjYXQyDQojcGh5c2kyX3MkcG9saXR5X2RlbWR1bW15IFtwaHlzaTJfcyRwb2xpdGNhdDIgPD0gMi41XSA8LSAxDQojcGh5c2kyX3MkcG9saXR5X2RlbWR1bW15IFtwaHlzaTJfcyRwb2xpdGNhdDIgPiAgMi41XSA8LSAwDQojdGFibGUocGh5c2kyX3MkcG9saXR5X2RlbWR1bW15KQ0KDQojcGh5c2kyX3MkcG9saXR5X2Fub2R1bW15IDwtIHBoeXNpMl9zJHBvbGl0Y2F0Mg0KI3BoeXNpMl9zJHBvbGl0eV9hbm9kdW1teVtwaHlzaTJfcyRwb2xpdGNhdDIgPiAyLjUgJiBwaHlzaTJfcyRwb2xpdGNhdDIgPCA1LjVdIDwtIDENCiNwaHlzaTJfcyRwb2xpdHlfYW5vZHVtbXlbcGh5c2kyX3MkcG9saXRjYXQyIDw9IDIuNSB8IHBoeXNpMl9zJHBvbGl0Y2F0MiA+PSA1LjVdIDwtIDANCiN0YWJsZShwaHlzaTJfcyRwb2xpdHlfYW5vZHVtbXkpDQoNCiNwaHlzaTJfcyRwb2xpdHlfYXV0b2R1bW15IDwtIHBoeXNpMl9zJHBvbGl0Y2F0Mg0KI3BoeXNpMl9zJHBvbGl0eV9hdXRvZHVtbXlbcGh5c2kyX3MkcG9saXRjYXQyID49IDUuNV0gPC0gMQ0KI3BoeXNpMl9zJHBvbGl0eV9hdXRvZHVtbXlbcGh5c2kyX3MkcG9saXRjYXQyIDwgNS41XSA8LSAwDQojdGFibGUocGh5c2kyX3MkcG9saXR5X2F1dG9kdW1teSkNCg0KI3BoeXNpMl9zJHJlZ2ltZSA8LSBwaHlzaTJfcyRwb2xpdGNhdA0KI3BoeXNpMl9zJHJlZ2ltZVtwaHlzaTJfcyRwb2xpdHlfYXV0b2R1bW15PT0xXSA8LSAiYXV0byINCiNwaHlzaTJfcyRyZWdpbWVbcGh5c2kyX3MkcG9saXR5X2Fub2R1bW15PT0xXSA8LSAiYW5vIg0KI3BoeXNpMl9zJHJlZ2ltZVtwaHlzaTJfcyRwb2xpdHlfZGVtZHVtbXk9PTFdIDwtICJkZW1vIg0KDQojdW5pcXVlKHBoeXNpMl9zJGNudHJ5KQ0KDQp0YWJsZShwaHlzaTJfcyRyZWdpbWUpDQoNCnFvZzIwMDAgPC0gc3Vic2V0KHFvZyxxb2ckeWVhcj09MjAxMCB8DQogICAgICAgICAgICAgICAgICAgICAgIHFvZyR5ZWFyPT0yMDExIHwgIA0KICAgICAgICAgICAgICAgICAgICAgICBxb2ckeWVhcj09MjAxMiB8IA0KICAgICAgICAgICAgICAgICAgICAgICBxb2ckeWVhcj09MjAxMyB8IA0KICAgICAgICAgICAgICAgICAgICAgICBxb2ckeWVhcj09MjAxNCB8IA0KICAgICAgICAgICAgICAgICAgICAgICBxb2ckeWVhcj09MjAxNSkNCg0KdGFibGUocW9nMjAwMCRnZF9wdHNhLHFvZzIwMDAkeWVhcikNCg0KcW9nMjAwMCRwZXJjMiA8LSBxb2cyMDAwJGdkX3B0c2ENCg0KcW9nMjAwMCRjbnRyeTwtY291bnRyeWNvZGUocW9nMjAwMCRjY29kZWNvdywgImNvd24iLCJjb3VudHJ5Lm5hbWUuZW4iKQ0KDQpxb2cyMDAwJGNudHJ5ZWFycyA8LSBwYXN0ZShxb2cyMDAwJGNudHJ5LHFvZzIwMDAkeWVhcikNCg0KcGh5c2kyMDAwIDwtIHFvZzIwMDAgJT4lIGRwbHlyOjpzZWxlY3QoY250cnllYXJzLCBwZXJjMikNCg0KY29tYmluZWQgPC0gbWVyZ2UoY29tYmluZWQsIHBoeXNpMjAwMCwgYnkgPSAiY250cnllYXJzIikNCg0KcGh5c2kyMjAwMCA8LSBkZHBseShjb21iaW5lZCx+Y250cnksDQogICAgICAgICAgICAgICAgc3VtbWFyaXNlLHRlcnJvcj1tZWFuKHBlcmMyLG5hLnJtPVQpKQ0KDQpjb21iaW5lZCA8LSBtZXJnZShjb21iaW5lZCwgcGh5c2kyMjAwMCwgYnkgPSAiY250cnkiKQ0KDQojdGFibGUocW9nMjAwMCR1bmRwX2hkaSxxb2cyMDAwJHllYXIpDQoNCiNwaHlzaWZmIDwtIHFvZzIwMDAgJT4lIGRwbHlyOjpzZWxlY3QoY250cnllYXJzLCB1bmRwX2hkaSkNCg0KI2NvbWJpbmVkIDwtIG1lcmdlKGNvbWJpbmVkLCBwaHlzaWZmLCBieSA9ICJjbnRyeWVhcnMiKQ0KDQojcGh5c2lmZjIgPC0gZGRwbHkoY29tYmluZWQsfmNudHJ5LA0KIyAgICAgICAgICAgICAgICAgICAgc3VtbWFyaXNlLGhkaT1tZWFuKHVuZHBfaGRpLG5hLnJtPVQpKQ0KDQojY29tYmluZWQgPC0gbWVyZ2UoY29tYmluZWQsIHBoeXNpZmYyLCBieSA9ICJjbnRyeSIpDQoNCg0KZ25pIDwtIHJlYWRfY3N2KCJHTkkuY3N2IiwgIHNraXAgPSAxKQ0KDQpnbmkkYDIwMTVgPC1nc3ViKCJ0dHQiLCIiLGduaSRgMjAxNWApDQpnbmkkYDIwMTVgPC1nc3ViKCJmZiIsIiIsZ25pJGAyMDE1YCkNCmduaSRgMjAxNWA8LWdzdWIoInNzcyIsIiIsZ25pJGAyMDE1YCkNCmduaSRgMjAxNWA8LWdzdWIoInV1dSIsIiIsZ25pJGAyMDE1YCkNCmduaSRgMjAxNWA8LWdzdWIoIm8iLCIiLGduaSRgMjAxNWApDQpnbmkkYDIwMTVgIDwtIGFzLm51bWVyaWMoZ25pJGAyMDE1YCkNCg0KZ25pJGAyMDE0YDwtZ3N1YigidHR0IiwiIixnbmkkYDIwMTRgKQ0KZ25pJGAyMDE0YDwtZ3N1YigiZmYiLCIiLGduaSRgMjAxNGApDQpnbmkkYDIwMTRgPC1nc3ViKCJzc3MiLCIiLGduaSRgMjAxNGApDQpnbmkkYDIwMTRgPC1nc3ViKCJ1dXUiLCIiLGduaSRgMjAxNGApDQpnbmkkYDIwMTRgPC1nc3ViKCJvIiwiIixnbmkkYDIwMTRgKQ0KZ25pJGAyMDE0YCA8LSBhcy5udW1lcmljKGduaSRgMjAxNGApDQoNCmduaTwtZ25pWyxjKDIsMjM6MjgpXQ0KDQpnbmk8LWdhdGhlcihhcy5kYXRhLmZyYW1lKGduaSksa2V5ID0gIkNvdW50cnkiKQ0KbmFtZXMoZ25pKSA8LSBjKCJjbnRyeSIsInllYXIiLCJnbmkiKQ0KDQpnbmkkY250cnk8LWNvdW50cnljb2RlKGduaSRjbnRyeSwiY291bnRyeS5uYW1lLmVuIiwiY291bnRyeS5uYW1lLmVuIikNCmduaSRjbnRyeWVhcnMgPC0gcGFzdGUoZ25pJGNudHJ5LGduaSR5ZWFyKQ0KDQpwaHlzaWduaSA8LSBnbmkgJT4lIGRwbHlyOjpzZWxlY3QoY250cnllYXJzLCBnbmkpDQoNCmNvbWJpbmVkIDwtIG1lcmdlKGNvbWJpbmVkLCBwaHlzaWduaSwgYnkgPSAiY250cnllYXJzIikNCg0KcGh5c2lnbmkyIDwtIGRkcGx5KGNvbWJpbmVkLH5jbnRyeSwNCiAgICAgICAgICAgICAgICAgICAgc3VtbWFyaXNlLGduaV9jPW1lYW4oZ25pLG5hLnJtPVQpKQ0KDQpjb21iaW5lZCA8LSBtZXJnZShjb21iaW5lZCwgcGh5c2lnbmkyLCBieSA9ICJjbnRyeSIpDQoNCg0KDQpgYGANCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0K